数据结构(四)

数据结构(四)

  • 算法
    • 算法的特征
    • 算法和程序的区别
    • 怎么样评判一个算法的好坏
  • 常见的查找算法
    • 线性
    • 树状
    • 哈希查找
      • 构建哈希函数的方法
        • 质数求余法
        • 解决冲突

算法

一堆指令的有序集合

算法的特征

唯一性:每一句话只有一种解释
有穷性:算法能描述完
可行性:可以执行的
输入:
一堆指令的有序集合
输出:

算法和程序的区别

程序是用语言实现算法的代码
算法是静态的,程序是动态的
算法是有穷的,程序是无穷的

怎么样评判一个算法的好坏

1.算法是否容易被实现,容易被人阅读、理解、维护
2.算法的执行的代价
空间复杂度:算法在执行的时候,需要内存提供给我们多少空间才能保证算法正常工作
1.字节对齐
2.位域
3.减少额外的空间
4.用完即释放
时间复杂度:算法在执行的时候,需要花费的时间
研究时间复杂度,研究的是我们的量级 O(n)
优化时间复杂度:
1.减少循环的使用
2.减少无用的代码存在

常见的查找算法

线性

顺序查找:从前往后按顺序查找。
二分查找:对于有序的顺序表来说,可以使用二分查找。
分块查找:块间有序,块内无序。

在这里插入图片描述

#include <stdio.h>
//失败,返回-1,成功返回下标
int BinLookUp(int data[], int low, int high, int item)
{int mid = 0;while(low <= high){mid = (low + high) / 2;if(data[mid] == item){return mid;}if(data[mid] > item){//再左边找,改上界high = mid-1;}if(data[mid] < item){low = mid+1;}}return -1;
}
int main(int argc, const char *argv[])
{
int opt = 0;
int ret = 0;
int arr[13] = {11, 13, 23, 25, 28, 29, 33, 35, 37, 39, 47, 49, 55};
while(1)
{printf("请输入要朝找的值:");scanf("%d", &opt);if(-1 == opt) break;//找ret = BinLookUp(arr, 0, 12, opt);if(-1 == ret){puts("没找到!");}else{printf("arr[%d] = %d\n", ret, opt);}
}
return 0;
}

树状

排序二叉树:排序二叉树类似于链表的二分查找

哈希查找

在这里插入图片描述

构建哈希函数的方法

直接地址法
在这里插入图片描述
平方取中法

质数求余法

在这里插入图片描述

冲突:多个记录的关键字指向同一个空间

解决冲突

开放地址法
在这里插入图片描述
链地址法
在这里插入图片描述
采用质数求余法设立哈希函数,链地址法解决冲突

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义表结点结构体
typedef struct linknode
{/* member */int Data;struct linknode *Next;
}HNode;
//定义哈希函数
int HashFunc(int key)
{return key%13;
}
//定义哈系表的插入函数
//形参:插入的表,插入的值
void InsertHash(HNode *arr[], int item)
{//将item插入到arr里面int key = HashFunc(item);//分配结点并赋值HNode *pNew = (HNode *)malloc(sizeof(HNode));if(!pNew) return ;memset(pNew, 0, sizeof(HNode));pNew->Data = item;//插入//头插//1、保护结点pNew->Next = arr[key];//2、插入arr[key] = pNew;return ;
}
//在哈系表中查询元素
//参数:被查询的表、被查询的元素
//返回值:找到返回下标,没找到返回-1
int SearchHash(HNode *arr[], int item)
{//经过哈希函数计算得到位置int key = HashFunc(item);//在 arr[key] 所指向的表中查询itemHNode *pTmp = arr[key];while(pTmp!=NULL){if(pTmp->Data == item) return key;//ptmp往后移动pTmp = pTmp->Next;}return -1;
}
int main(int argc, const char *argv[])
{int opt = 0, ret = 0;//定义存储被放入到哈西的值int data[14] = {82, 28, 99, 56, 37, 22, 19, 31, 67, 34, 66, 38, 15, 93};//定义哈希空间,结构体指针数组HNode *Hash[15] = {NULL};//将元素插入到Hash表中 data[i] -> Hashfor(int i=0; i<14; i++){InsertHash(Hash, data[i]);}while(1){puts("请输入要查询的元素:");scanf("%d", &opt);if(-1 == opt) break;//在Hash里面查询 optret = SearchHash(Hash, opt);if(-1 == ret) puts("没找到!");else printf("找到了,Hash[%d]里面有!", ret);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业活动想找媒体报道宣传怎样联系媒体?

在那遥远的公关江湖里,有一个传说,说的是一位勇士,手持鼠标和键盘,踏上了寻找媒体圣杯的征途。这位勇士,就是我们亲爱的市场部门小李,他的任务是为公司即将举行的一场盛大的企业活动找到媒体的聚光灯。 小李的故事,开始于一张空白的Excel表格,上面列着各大媒体的名称,旁边是一片…

如何让大模型更聪明

目录 如何让大模型更聪明&#xff1f; &#x1f349;算法创新 &#x1f348;新型优化算法 &#x1f34d;案例分析&#xff1a;LAMB优化器 &#x1f348;对比学习 &#x1f34d;应用案例&#xff1a;SimCLR &#x1f348;强化学习 &#x1f34d;案例分析&#xff1a;Alph…

【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

蓝桥杯-班级活动

题目描述 小明的老师准备组织一次班级活动。班上一共有 ( n ) 名&#xff08;( n ) 为偶数&#xff09;同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 ( n ) 以内的正整数作为 id&#xff0c;第 …

C++标准库中string的底层实现方式

对于C中 std::string 的一些基本功能和用法&#xff0c;我们应该都很熟悉。但它底层到底是如何实现的呢? 其实在 std::string 的历史中&#xff0c;出现过几种不同的方式。下面我们来一一揭晓。 我们可以从一个简单的问题来探索&#xff0c;一个 std::string 对象占据的内存空…

RK3568笔记二十五:RetinaFace人脸检测训练部署

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 Retinaface是来自insightFace的又一力作&#xff0c;基于one-stage的人脸检测网络。RetinaFace是在RetinaNet基础上引申出来的人脸检测框架&#xff0c;所以大致结构和RetinaNet非常像。 官方提供两种主干特征提取网…

Python 中别再用 ‘+‘ 拼接字符串了!

当我开始学习 Python 时&#xff0c;使用加号来连接字符串非常直观和容易&#xff0c;就像许多其他编程语言&#xff08;比如Java&#xff09;一样。 然而&#xff0c;很快我意识到许多开发者似乎更喜欢使用.join()方法而不是。 在本文中&#xff0c;我将介绍这两种方法之间的…

关于数据库和数据表的基础SQL

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…

python内置函数map/filter/reduce详解

在Python中&#xff0c;map(), filter(), 和 reduce() 是内置的高级函数(实际是class)&#xff0c;用于处理可迭代对象&#xff08;如列表、元组等&#xff09;的元素。这些函数通常与lambda函数一起使用&#xff0c;以简洁地表达常见的操作。下面我将分别解释这三个函数。 1. …

xgboost项目实战-保险赔偿额预测与信用卡评分预测001

目录 算法代码 原理 算法流程 xgb.train中的参数介绍 params min_child_weight gamma 技巧 算法代码 代码获取方式&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1QV7nMC5ds5wSh-M9kuiwew?pwdx48l 提取码&#xff1a;x48l 特征直方图统计&#xff1a; fig, …

各大模型厂商API使用:百度、阿里、豆包、kimi、deepseek

百度ERNIE(支持requests接口) ERNIE Speed、ERNIE Lite免费 免费测试下来模型ernie_speed输出吞吐量计算20-30来个,“{length/cost} tokens/s” 输出总长度/耗时 https://qianfan.cloud.baidu.com/ 文档: https://cloud.baidu.com/doc/WENXINWORKSHOP/s/dltgsna1o a…

智能进化:深度学习与进化计算的融合艺术

《进化深度学习》这本书深入探索了进化计算&#xff08;EC&#xff09;在深度学习领域的应用&#xff0c;为读者提供了一套丰富而实用的技术工具&#xff0c;这些工具可以贯穿深度学习的整个过程&#xff0c;助力研究者们解决各种复杂的问题。书中不仅详细介绍了遗传算法和进化…

怎么理解直接程序控制和中断方式?

直接程序控制 看完之后是不是依然一头雾水&#xff1f;来看下面两个例子 无条件传送 假设你正在使用键盘打字。当你敲击键盘上的一个键时&#xff0c;键盘会立即产生一个信号&#xff08;即输入数据&#xff09;&#xff0c;并且这个信号会立即被电脑接收。在这个过程中&…

比较两列数据

点其中一个数据 删掉S&#xff0c;回车 大的标红

v-cloak 用于在 Vue 实例渲染完成之前隐藏绑定的元素

如果你是后端开发者&#xff08;php&#xff09;&#xff0c;在接触一些vue2开发的后台时&#xff0c;会发现有这段代码&#xff1a; # CDN <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> # 或 <script src"https://cd…

三十六计的笔记

系列文章目录 三十六计的笔记 文章目录 系列文章目录1、瞒天过海2、围魏救赵3、借刀杀人4、以逸待劳5、趁火打劫6、声东击西7、无中生有8、暗渡陈仓9、隔岸观火10、笑里藏刀11、李代桃僵12、顺手牵羊13、打草惊蛇14、借尸还魂15、调虎离山16、欲擒故纵17、抛砖引玉18、擒贼擒王…

9.3 Go语言入门(变量声明和函数调用)

Go语言入门&#xff08;变量声明和函数调用&#xff09; 目录二、变量声明和函数调用1. 变量声明1.1 使用 var 关键字声明1.2 简短声明1.3 零值1.4 常量 2. 函数调用2.1 函数定义2.2 多个返回值2.3 命名返回值2.4 可变参数2.5 匿名函数和闭包 目录 Go 语言&#xff08;Golang&a…

粤嵌—2024/5/21—打家劫舍(✔)

代码实现&#xff1a; int rob(int *nums, int numsSize) {if (numsSize 1) {return nums[0];}if (numsSize 2) {return fmax(nums[0], nums[1]);}int dp[numsSize];dp[0] nums[0];dp[1] fmax(nums[0], nums[1]);for (int i 2; i < numsSize; i) {dp[i] fmax(dp[i - 1…

高中数学:平面向量-正交分解、坐标表示、坐标运算

一、正交分解 二、坐标表示 这里注意一点 坐标A(x,y)与向量 a → \mathop{a}\limits ^{\rightarrow} a→的坐标记作&#xff1a; a → \mathop{a}\limits ^{\rightarrow} a→(x,y)&#xff0c;表示方式的区别 引申 三、加减运算的坐标表示 四、数乘运算的坐标表示 引申 两向量…

Go微服务: Nacos的搭建和基础API的使用

Nacos 概述 文档&#xff1a;https://nacos.io/docs/latest/what-is-nacos/搭建&#xff1a;https://nacos.io/docs/latest/quickstart/quick-start-docker/有很多种搭建方式&#xff0c;我们这里使用 docker 来搭建 Nacos 的搭建 这里&#xff0c;我们选择单机模式&#xf…