从一个简单查找问题看算法的魅力
来源:互联网 发布:mac的library在哪 编辑:程序博客网 时间:2024/06/05 07:47
问题描述
有一个大小为m的整形数组,数组是从小到大有序的,现在要求给定一个数,在数组中查找,如果找到,给出下标,否则返回-1。
两种解决思路
顺序查找
顺序查找的思路很简单,我们从第一个元素开始比较,如果目标值等于当前的值,此时结束程序。如果目标值小于当前值,由于数组是排序的,后面的元素都比当前大,所以后面的元素不可能出现目标值,此时结束程序。如果查找整个数组还没有找到,结束程序。
c语言代码如下:
int line_search(const int array[], int size, int key) { int i = 0; for (/* empty */; i < size; i++) { if (key <= array[i]) { break; } } if (key < array[i] || i == size) { return -1; } else { return i; }}
二分查找
二分查找就是首先把目标值与整个数组的中间的值相比较,如果找到就直接返回;如果目标值比中间的值大,说明目标值在数组后半部分,我们就抛弃前半部分;相反,我们抛弃后半部分,查找前半部分。然后继续从剩下的部分的一半继续比较。就这样不断的二分下去,直到找到或者不可二分后还没找到,结束程序。
c语言程序如下:
int binary_search(const int array[], int low, int high, int key) { int middle = 0; while (low <= high) { //当low == high时,还有一次比较 middle = (low + high) / 2;//二分 if (array[middle] == key) { return middle; } else if (array[middle] < key) { low = middle + 1;//比较后半部份 } else { high = middle - 1;//比较前半部分 } } return -1;}
两种算法分析
两种算法的最好情况都是第一次比较就是要查找的元素,这时的时间复杂度为1。
对于顺序查找,他的最坏情况会遍历整个数组,这样的时间复杂度为m。
对于二分查找,m个元素可以进行的二分次数k我们可以算出:
当
通过精心的设计程序,能够大幅度的降低运算时间,这就是算法的意义所在。
总结
关于算法的研究已经有几千年的历史了,学习算法能够让我们体验到用计算机解决实际问题的那种成就感。这是一系列文章的开端,接下来我还会写更多的关于算法以及数据结构的文章。
0 0
- 从一个简单查找问题看算法的魅力
- 一道简单的算法问题--数学的魅力
- 从一个问题的多个算法看算法的优化
- 从百元百鸡这个简单问题看算法优化
- 一个简单的路径查找问题
- 从一个简单的逻辑看严谨的软件设计
- 从一个简单的计时器,看Java接口的作用
- 从一个简单的内核看操作系统的工作
- 从一个进度条看问题
- 从一个简单的三元结构 看C,C++
- 从一个很很简单的程序看指针
- 从一个简单的聊天程序SimpleChat看VPN技术
- 从一个简单数据分析看机器学习的概念
- 李开复: 算法的魅力
- 从一个新手遇到的问题看DataReader
- 从一个问题看MySQL的权限访问控制
- 从ZOJ 1666看找零问题的算法
- 【我看Spring】从一个简单的AOP示例看切面编程
- 简单选择排序(该出手时才出手)
- 读取assets中的图片
- 防止MTU设置不合理导致的链路不通问题
- 一、ngCookies 模块
- Linux 与 BSD 有什么不同?
- 从一个简单查找问题看算法的魅力
- Vultr CentOS6.8换内核装锐速
- 前端开源项目周报0221
- UDP主要丢包原因及具体问题分析
- 文章标题
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
- 欢迎使用CSDN-markdown编辑器
- 字符编码过滤器以及Servlet实践
- vs2012只设置一次opencv库的方法