二分查找

sort排序与二分查找

别说谁变了你拦得住时间么 提交于 2019-11-28 22:35:22
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; int main() { const int N=5; string a[N]={"www","algorithm","racer","text","wait"}; vector<string> b(a,a+5);//数组转化成向量 for(size_t i=0;i<N;++i) cout<<b[i]<<" "; cout<<endl; sort(a,a+N); for(int i=0;i<N;++i)//使用sort进行数组排序 cout<<a[i]<<" "; cout<<endl; sort(b.begin(),b.end());//向量正序排列 for(const auto& x:b) cout<<x<<" "; cout<<endl; sort(b.rbegin(),b.rend());//向量倒序排列 for(const auto& x:b)//基于范围的for循环 cout<<x<<" "; cout<<endl; system("pause"); return 0; } 来源: https://www.cnblogs.com/wangtianning1223/p/11431039

排序与搜索(四):二分查找

独自空忆成欢 提交于 2019-11-28 20:11:32
搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找 二分法查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好; 其缺点是要求待查表为有序表 ,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 二分法查找实现 非递归实现与递归实现 #-*-coding:utf-8-*- #auth:kokopop def binary_serch(alist,item): """二分查找递归实现""" n=len(alist) if n>0: mid = n // 2 if alist[mid] == item: return True elif item < alist[mid]: return binary_serch(alist[:mid], item) else: return binary_serch(alist[mid

符号表

寵の児 提交于 2019-11-28 18:32:42
符号表是一种存储键值对的数据结构,支持两种操作, - 插入(put) 将新的键值对存入表中 - 查询(get) 给定键得到相应的值 规则 重复的键 每一个键只能对应着一个值(表中不允许存在重复的键) 当存入的的键值对和表中已有的键冲突时,新的值会替代旧的值 空键 键不能为空,使用空键会产生一个运行异常。 空值 规定不允许有空值,当键不存在时get()返回空,任何不在表中的键关联的值都是空 删除操作 在表中删除有两种方法: 延迟删除 ,也就是将键对应的值置为空(null) put(key,null) 及时删除 ,delete(key) 实现 符号表分为有序和无序两种 无序链表的顺序查找 public class SequentialSearchST<K, V> { private class Node { K key; V val; Node next; public Node(K key, V val, Node next) { this.key = key; this.val = val; this.next = next; } } private Node first; public V get(K key) { for (Node x = first; x != null; x = x.next) { if (key.equals(x.key)) { return x.val

用递归实现二分查找

扶醉桌前 提交于 2019-11-28 16:20:40
有一个列表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],用二分查找法实现查找 版本一:能够实现查找,但由于切片会开辟新的内存存放列表新的列表,所以不能返回元素在原列表的下标 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] def find(l,site): half = len(l) // 2 #长度切一半,下标锁定在范围中间 if l[half] < site: #参数大于列表中间的元素,表面参数在列表右边 new_l = l[half:] #从中间切到最后得到新的列表 find(new_l,site) #调用本身,传入新的列表 elif l[half] > site: #参数小于列表中间的元素,表面参数在列表左边 new_l = l[0:half+1] #从开始切到列表中间 find(new_l, site) #调用本身,传入新的列表 else: #等于参数 print('找到了',l[half]) find(l,66) 版本二:不通过切片的方式,能够返回元素下标位置,但还有细节可以改进 l = [2, 3, 5, 10, 15, 16, 18, 22, 26,

14. 二分查找

为君一笑 提交于 2019-11-28 15:09:49
原文引用 大专栏 https://www.dazhuanlan.com/2019/08/26/5d6353ca4af56/ 描述 给定一个排序的整数数组(升序)和一个要查找的整数 target ,用 O(logn) 的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回 -1 . 样例 在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找 3 ,返回 2 . 挑战 如果数组中的整数个数超过了2^32,你的算法是否会出错? 如果对二分查找比较陌生话,那么讲个小游戏,猜数字,在0-10000中随机取个数,让你猜,猜错了告诉你大了还是小了. 那么第一想法是什么?报中位数?对,不停的报中位数直到剩下最后一个数,这个数就是所需数,这个方法是比一个一个遍历要快非常多所需步骤也仅为log2n 回到正题 class Solution: def binarySearch(self, nums, target): # write your code here start=0 end=len(nums) mid=int(end/2) while start<=end: n_mid = nums[mid] if n_mid <target: #right start=mid+1 mid=int((end+start)/2) elif n_mid

线性查找&二分查找

霸气de小男生 提交于 2019-11-28 11:34:56
'''线性查找: 从头至尾依次匹配。时间复杂度为O(n)'''def linear_search(li, val): for index in range(len(li)): if val == li[index]: return index return None列表的index()方法使用的线性查找,因为列表是无序的'''二分查找:在排序的列表中查找某元素。时间复杂度为O(log2n)'''def binary_search(orderd_list, val): left = 0 right = len(orderd_list) - 1 while left <= right: mid = (left + right) // 2 if val == orderd_list[mid]: return mid elif val > orderd_list[mid]: # 要查找的值在mid右侧 left = mid + 1 else: # 要查找的值在mid左侧 right = mid - 1 return None 来源: https://www.cnblogs.com/staff/p/11406743.html

程序员,你应该知道的二分查找算法

血红的双手。 提交于 2019-11-28 06:27:44
原理 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 为了方便理解,我们以数组 1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39 ,在数组中查找 26 为例,制作了一张查找过程图,其中 low 标示左下标, high 标示右下标, mid 标示中间值下标 二分查找的过程就像上图一样,如果中间值大于查找值,则往数组的左边继续查找,如果小于查找值这往右边继续查找。二分查找的思想虽然非常简单,但是查找速度非常长,二分查找的时间复杂度为O(logn)。虽然二分查找的时间复杂度为O(logn)但是比很多O(1)的速度都要快,因为O(1)可能标示一个非常大的数值,比例O(1000)。我们来看一张二分查找与遍历查找的效率对比图。 图片来源网络 从图中可以看出二分查找用了三步就找到了查找值,而遍历则用了11步才找到查找值,二分查找的效率非常高。但是二分查找的局限性非常大。那二分查找有哪些局限性呢? 局限性 二分查找依赖数组结构 二分查找需要利用下标随机访问元素,如果我们想使用链表等其他数据结构则无法实现二分查找。 二分查找针对的是有序数据

二分查找法:x 的平方根

二次信任 提交于 2019-11-28 05:41:43
实现 int sqrt(int x) 函数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 public int mySqrt(int x) { long left=0; long rigth=Integer.MAX_VALUE; while(left<rigth){ // 这种取中位数的方法又快又好,是我刚学会的,原因在下面这篇文章的评论区 // https://www.liwei.party/2019/06/17/leetcode-solution-new/search-insert-position/ // 注意:这里得用无符号右移动 long mid=(left+rigth+1)>>>1; long s=mid*mid; if(s>x){ rigth=mid-1; }else{ left=mid; } } return (int)left; } 来源: https://www.cnblogs.com/hanxiaomin/p/11394811.html

查找算法(I) 顺序查找 二分查找 索引查找

走远了吗. 提交于 2019-11-27 23:29:58
查找   本文为查找算法的第一部分内容,包括了基本概念,顺序查找、二分查找和索引查找。关于散列表和B树查找的内容,待有空更新吧。 基本概念   查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录。   若没有找到满足条件的记录,则返回特定值,表明查找失败;若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理;若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一条记录的过程,即首先在整个区间内查找到满足条件的第一条记录,接着在剩余的区间内查找满足条件的第一条记录,以此类推,直到剩余 区间为空为止。   作为查找对象的表的结构不同,其查找方法一般也不同。   查找过程是关键字比较的过程,比较次数的多少就是相应算法的时间复杂度,它是衡量一个查找算法优劣的重要指标。   对于一个查找算法的时间复杂度,还可以采用平均查找长度(Average Search Length, ASL),即在查找成功情况下的平均比较次数来表示。   平均查找长度的计算公式为:   ASL=∑p i ci   其中n为查找表的长度,即表中所含元素的个数,p i 为查找第i个元素的概率, c i 为查找第i个元素时所需的比较次数。   若查找每个元素的概率相同

顺序查找与二分查找算法

三世轮回 提交于 2019-11-27 23:29:44
顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。该算法的时间复杂度为O(n),如果数据量很大时查找效率会很低。 1 #include<stdio.h> 2 3 /* 顺序查找算法 4 a为数据数组,len为数组a的长度,x为查找的元素 5 如果查找成功返回元素x在数组a中的下标,找不到则返回-1 6 */ 7 int search(int a[],int len, int x) 8 { 9 int i; 10 for (i=0; i<len; i++) 11 { 12 if(x==a[i]) 13 return i; // 返回元素的下标 14 } 15 return -1; // 没有找到 16 } 17 18 int main() 19 { 20 int a[10]={1,3,5,2,0,9,8,4,7,6}; 21 int x=2; // 需要查找的元素 22 int i = search(a, 10, x); 23 if(i!=-1) 24 printf("元素%d在第%d个位置\n",x,i+1); 25 else 26 printf("没有找到元素:%d\n",x); 27 return 0; 28 } 二分查找算法