python算法之二分查找
说明:大部分代码是在网上找到的,好几个代码思路总结出来的
通常写算法,习惯用C语言写,显得思路清晰。可是假设一旦把思路确定下来,并且又不想打草稿。想高速写下来看看效果,还是python写的比較快。也看个人爱好。实习的时候有个同事对于python的缩进来控制代码块各种喷。。。。他认为还是用大括号合适。。。怎么说呢,适合自己的才是最好的。我个人的毛病就是,写了几天C,到要转到python的时候,代码中依旧有C的影子。。比方大括号问题,比方忘记在while或这for、if、else等后面加“:”。而假设写了几天Python,要转到C的时候。会忘记声明一些变量。直接拿来就用。执行的时候,各种变量没有定义。在这里给自己提个醒。多思考也要多动手。
今天无意中看到了二分查找。本来以为非常easy的代码。几行就结束了,后来看到了一个比較牛的代码。才发现人比人该死是永恒的真理。为了不该死,也要把不该死的代码学会才行啊,二分查找的原理非常easy,就是在一个有序序列中。查找代码是一半一半的比較而不是一个一个的比較
最简单的二分查找非递归代码例如以下:
int search(int array[], int n, int v)
{
int left, right, middle; left = 0, right = n - 1; while (left <= right)
{
middle = (left + right) / 2;
if (array[middle] > v)
{
right = middle;
}
else if (array[middle] < v)
{
left = middle;
}
else
{
return middle;
}
} return -1;
}
输入:array数组。array大小n,查找元素v
输出:v的所在位置,没有找到返回-1
#####################################################################################################################################
以下写个递归的代码:
#include<stdio.h> int search(int arr[],int low,int high,int key)
{
int mid = (low+high)/2;
if(low > high)
return -1;
if(arr[mid] == key)
return mid;
else if(arr[mid]>key)
return search(arr,low,mid-1,key);
else
return search(arr,mid+1,high,key);
}
int main()
{
int arr[101] = {1,2,3,4,87,90,100};
int low = 0,high = 8,key = 87,ret;
ret = search(arr,low,high,key);
if(ret != -1)
printf("the return is %d",ret);
else
printf("FBI warning:the return is -1,not find the key");
}
不知道递归的同学。请參考递归的吐槽。。。如图:当年第一次听到老师说递归的时候,想的就是这个
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmVjc3lzbWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
可是事实上递归是这种
好了不扯了。二分查找这个代码事实上细致看的话还是有点问题的。比方说这个三次推断。两次比較。还有就是
在循环体内,计算中间位置的时候,使用的是这个表达式:
假如,left与right之和超过了所在类型的表示范围的话,那么middle就不会得到正确的值.
所以,更稳妥的做法应该是这种:
那我们优化一下,python代码例如以下:
def search(arr,n,v):
left = -1
right = n
while(left+1 != right):
mid = left+(right-left)/2
if(arr[mid] < v):
left = mid
else:
right = mid
if(right >= n or arr[right] != v):
right = -1
return right
if __name__ == '__main__':
arr = [1,2,4,23,87,90,555,1222,1444]
n = len(arr)
ret = search(arr,n,87)
print ret
看C的代码:
int search(int array[], int n, int v)
{
int left, right, mid; left = -1, right = n; while (left + 1 != right)
{
mid = left + (right - left) / 2; if (array[mid] < v)
{
left = mid;
}
else
{
right = mid;
}
} if (right >= n || array[right] != v)
{
right = -1;
} return right;
}
这个代码先不说理不理解,光返回值仅仅用right这个就非常牛逼,这样看着非常easy,可是非常精髓的感觉有没有?再看while的推断,left+1!=right是不是非常正点?自己理解ba
python算法之二分查找的更多相关文章
- Python 算法之二分查找
二分查找 二分查找又称折半查找 优点是比较次数少,查找速度快,平均性能好 缺点是要求待查表为有序表,且插入删除困难 折半查找方法适用于不经常变动而查找频繁的有序列表. 猜数字游戏 1.生成一个有序列表 ...
- Python算法之二分查找法
1: l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 从列表中找到某个num的位置 def ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...
- 分治算法(二分查找)、STL函数库的应用第五弹——二分函数
分治算法:二分查找!昨天刚说不写算法了,但是突然想起来没写过分治算法的博客,所以强迫症的我…… STL函数库第五弹——二分函数lower_bound().upper_bound().binary_se ...
- Python——递归、二分查找算法
递归函数 1. 递归 (1)什么是递归:在函数中调用自身函数(2)最大递归深度:默认997/998——是Python从内存角度出发做的限制 n = 0 def story(): global n n+ ...
- Python递归函数和二分查找算法
递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属 ...
- python之路——二分查找算法
楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...
- 用Python实现的二分查找算法(基于递归函数)
一.递归的定义 1.什么是递归:在一个函数里在调用这个函数本身 2.最大递归层数做了一个限制:997,但是也可以自己限制 1 def foo(): 2 print(n) 3 n+=1 4 foo(n) ...
随机推荐
- ie条件注释还能这样写
通过条件注释给html开始标签定义不同的class, 来区分不同版本的IE,可以在样式表中避免 样式属性hack (如 _margin-top, *float:none ) 注意: IE10+不支持条 ...
- Windows Azure 社区新闻综述(#77 版)
欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话.以下是本周的亮点. 文章.视频和博客文章 · 文章: Windows Azure 表存储简 ...
- Codeforces Round #200 (Div. 2) C. Rational Resistance
C. Rational Resistance time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 10994 - Simple Addition(规律)
Problem E Simple Addition Input: Standard Input Output: Standard Output Let’s define a simple recurs ...
- ios改变系统默认样式
iso系统下默认不能修改submit样式,于是加上如下属性就可以修改: -webkit-appearance:none; -moz-appearance:none; 先记录下.
- hadoop -- mapreduce执行过程
1.运行mapreduce程序 ---run2.本次运行将会生成呢个一个Job , 于是JobClient向JobTracker申请一个JobID 标识该Job.3.JobClient将Job需要的 ...
- static timing analysis 基础
此博文依据 特权同学在电子发烧友上的讲座PPT进行整理而成. static timing analysis 静态时序分析基础 过约束:有不必要的约束,或者是约束不能再某一情况下满足.——约束过头了 ...
- 【HTTP 2】启用 HTTP 2(Starting HTTP/2)
[HTTP 2]启用 HTTP 2(Starting HTTP/2) 四月 1, 2016 ~ LITECODES 前情提要 在上一篇文章<[HTTP 2]HTTP/2 协议概述(HTTP/2 ...
- SQLite数据转换成sql server数据
需要将SQLite数据库里的数据导入到SQL Server,在网上搜了好久,没有找到一个方便实用的方法. 经过本人的细心琢磨实验,终于让我给找到一好的方法:使用CSV文件作为介质来做转换.现在记录下来 ...
- shell脚本中每次读取文件的一行
写法一: #!/bin/bash while read linedo echo $line #这里可根据实际用途变化 done < file #需要读取的文件 ...