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) ...
随机推荐
- DataReader的例子
前: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataReader对 ...
- Poj 2499 Binary Tree(贪心)
题目链接:http://poj.org/problem?id=2499 思路分析:结点向左边移动时结点(a, b)变为( a+b, b),向右边移动时( a, b )变为( a, a + b); 为求 ...
- Android Input设备debug技巧
一.驱动层 检查是否有点上报 adb shell getevent -l /dev/input/eventX 检查input设备支持的属性值 adb shell getevent -i /dev/in ...
- [Unity 3D] Unity 3D 里的碰撞检测
Unity 3D里两个碰撞体之间发生碰撞可以用OnCollision族函数和OnTrigger族函数来获知和处理.Unity官方给出了两张可发生碰撞的组合表: Collision detection ...
- ARM
ARM全新架构:cortex架构 cortex-A:高端:cortex-R:实时嵌入式系统:cortex-m:廉价: 哈佛结构:数据总线和地址总线分开: 冯若依曼:地址总线,数据总线不分开: cort ...
- 在storyboard中设置控件的layerbordercolor
在SB中控件可以在SB中直接利用kvc 设置一些属性值,不如layerwidth等 但是不能更改和颜色有关的属性因为layerbordercolor是CGColor.通过为CALayer增加属性可以实 ...
- 数矩形(N - 暴力求解、打表)
数矩形 Description 给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格. Input 第一行输入一个t, 表示有t组数据,然后 ...
- java 如何自定义异常 用代码展示 真心靠谱
先建两个自定义的异常类 ChushufuException类 class ChushufuException extends Exception { public ChushufuException( ...
- POJ2395 最小生成树 - Prime算法
题目: Out of Hay Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Description The ...
- 登陆整合实现-QQ互联认证(ASP.NET版本)
原文:登陆整合实现-QQ互联认证(ASP.NET版本) 首先 我们创建一个qq.ashx的页面,这个页面会跳转到QQ的请求界面 代码如下: QQSettingConfig qqSettingConfi ...