将做工程过程比较重要的代码片段备份一次,如下的代码内容是关于C++算法之数据查找的代码,应该对大家有较大帮助。

int find(int array[], int  length, int value)
{  if(NULL == array || 0 == length)  return -1;  for(int index = 0; index < length; index++){  if(value == array[index])  return index;  }  return -1;
} 复制代码

分析:由于我们不清楚这个数据判断究竟需要多少次。但是,我们知道,这样一个数据查找最少需要1次,那么最多需要n次,平均下来可以看成是(1+n)/2,差不多是n的一半。我们把这种比较次数和n成正比的算法复杂度记为o(n)。(2)上面的数据没有任何特征,这导致我们的数据排列地杂乱无章。试想一下,如果数据排列地非常整齐,那结果会是什么样的呢?就像在生活中,如果平时不注意收拾整齐,那么找东西的时候非常麻烦,效率很低;但是一旦东西放的位置固定下来,所有东西都归类放好,那么结果就不一样了,我们就会形成思维定势,这样查找东西的效率就会非常高。那么,对一个有序的数组,我们应该怎么查找呢?二分法就是最好的方法。

                                int binary_sort(int array[], int length, int value)
{  if(NULL == array || 0 == length)  return -1;  int start = 0;  int end = length -1;  while(start <= end){  int middle = start + ((end - start) >> 1);  if(value == array[middle])  return middle;  else if(value > array[middle]){  start = middle + 1;  }else{  end = middle -1;  }  }  return -1;
}复制代码

分析:上面我们说到普通的数据查找算法复杂度是o(n)。那么我们可以用上面一样的方法判断一下算法复杂度。这种方法最少是1次,那么最多需要多少次呢?我们发现最多需要log(n+1)/log(2)即可。大家可以找个例子自己算一下,比如说7个数据,我们发现最多3次;如果是15个数据呢,那么最多4次;以此类推,详细的论证方法可以在《算法导论》、《计算机编程艺术》中找到。明显,这种数据查找的效率要比前面的查找方法高很多。(3)上面的查找是建立在连续内存基础之上的,那么如果是指针类型的数据呢?怎么办呢?那么就需要引入排序二叉树了。排序二叉树的定义很简单:(1)非叶子节点至少一边的分支非NULL;(2)叶子节点左右分支都为NULL;(3)每一个节点记录一个数据,同时左分支的数据都小于右分支的数据。可以看看下面的定义:

                                typedef struct _NODE
{  int data;
}NODE;  那么查找呢,那就更简单了。if(NULL == pNode)  return NULL;  if(data == pNode->data)  return pNode;  else if(data < pNode->data)  return find_data(pNode->left, data);  else  return find_data(pNode->right, data);
} 复制代码

(4)同样,我们看到(2)、(3)都是建立在完全排序的基础之上,那么有没有建立在折中基础之上的查找呢?有,那就是哈希表。哈希表的定义如下:1)每个数据按照某种聚类运算归到某一大类,然后所有数据链成一个链表;2)所有链表的头指针形成一个指针数组。这种方法因为不需要完整排序,所以在处理中等规模数据的时候很有效。其中节点的定义如下:

typedef struct _LINK_NODE
{  int data;
}LINK_NODE; 复制代码

那么hash表下面的数据怎么查找呢?

                                {  int index = data % mod;  if(NULL == array[index])  return NULL;  while(pLinkNode){  if(data == pLinkNode->data)  return pLinkNode;  pLinkNode = pLinkNode->next;  }  return pLinkNode;
} 复制代码

分析:hash表因为不需要排序,只进行简单的归类,在数据查找的时候特别方便。查找时间的大小取决于mod的大小。mod越小,那么hash查找就越接近于普通查找;那么hash越大呢,那么hash一次查找成功的概率就大大增加。

转载于:https://juejin.im/post/5c408da7f265da61620da5dc

C++算法之数据查找的代码相关推荐

  1. 004 人物数据查找和代码编写

    文章目录 角色血量基址查找 分析角色其他属性 分析角色名字 搜索角色坐标 数据整理 代码编写 接着我们来开始找游戏数据,以编写自动打怪为目标,找齐这个功能所需要的所有的数据.第一个需要用到的数据就是角 ...

  2. 【预测模型】基于RLS算法求解数据预测matlab代码

    1 简介 为了提高经济领域统计数据的预测精度,代数多项式预测模型的建模 方法应运而生.该方法使用代数多项式模型拟合给定的经济统计数据,并使用递推最小二乘法(RLS)对多项式拟合模型的加权系数进行递推计 ...

  3. 智能优化与机器学习结合算法实现数据预测matlab代码清单

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  4. 家族关系查询系统程序设计算法思路_七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

  5. 基于粒子群算法优化的Elman神经网络数据预测-附代码

    基于粒子群算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于粒子群算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电 ...

  6. 基于布谷鸟算法优化的Elman神经网络数据预测-附代码

    基于布谷鸟算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于布谷鸟算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电 ...

  7. 【ELAMN预测】基于粒子群算法优化ELMAN神经网络实现数据回归预测 matlab代码

    1 简介 风能,作为一种重要,有潜力,无污染,可再生.可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐.近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世 ...

  8. 基于鲸鱼算法优化的Elman神经网络数据预测-附代码

    基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于鲸鱼算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电力负 ...

  9. 基于海鸥算法优化的Elman神经网络数据预测-附代码

    基于海鸥算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于海鸥算法优化的Elman神经网络数据预测 - 附代码 1.Elman 神经网络结构 2.Elman 神经用络学习过程 3.电力负 ...

最新文章

  1. 2208: [Jsoi2010]连通数
  2. python更新pip失败-解决Python pip 自动更新升级失败的问题
  3. C#后台访问前台Html控件的方法
  4. H5移动页面的touch事件与点击穿透问题
  5. 十大笔记本品牌型号命名规则【惠普】
  6. bash脚本使用记录
  7. Windows Terminal 窗口/控制台切换快捷键总结
  8. 搭建gradle环境
  9. 187.重复的DNA序列
  10. Oracle分区查询
  11. 目标规划第四章计算机求解,单纯形算法与目标规划地应用研究.doc
  12. 软件模式、GRASP原则,GoF设计模式、设计模式分类、设计模式的优点。
  13. 计算机一级excel题库百度云,全国计算机等级考试一级上机Excel题库
  14. cad插入块_CAD制图软件中如何快速绘制推拉窗平面简图
  15. IMAP4协议介绍nbsp;工作原理
  16. 978_使用emacs lisp安装emacs插件
  17. Android安全之使用root权限绕过检测机制,强行自动允许应用的悬浮窗/应用后台弹出界面等权限
  18. firefox autoproxy 实现ssh代理上网,针对XP,新版可以用firefox的foxproxy组件
  19. 【方法论】从入门到精通是怎样一种体验
  20. 【USACO题库】3.4.4 Raucous Rockers“破锣摇滚”乐队 题解

热门文章

  1. 一次redis集群连接数占满问题的排查
  2. Could not connect to Redis at 127.0.0.1:13141: Cannot assign requested address
  3. JavaScript中setInterval的参数传递个人归纳
  4. 蒙特卡洛粒子滤波定位算法_基于粒子滤波的TBD算法仿真—MATLAB仿真
  5. 计算机二级c语言考试真题及答案详解,计算机二级c语言试题及答案
  6. 一次选中多个物体_经验之谈|Anchor Boxes:物体检测的关键
  7. Vue.js 服务器端渲染指南
  8. 深度剖析浏览器渲染性能原理,你到底知道多少?
  9. san mysql,高性能MySQL:SAN和NAS
  10. linux内核长期支持版本,Linux Kernel 3.12长期支持分支迎来第63个维护版本