精确搜索算法,搜索简便算法怎么做,快速搜索算法

  精确搜索算法,搜索简便算法怎么做,快速搜索算法

  搜索是一种算法过程,用于在一组项目中找到特定的项目。搜索的通常答案是对或错,因为项目存在或不存在。几种常见的搜索方法:顺序搜索、二分法搜索、二叉树搜索和sad池搜索。

  二分搜索法又称二分搜索法,具有比较次数少、搜索速度快、平均性能好的优点。它的缺点是要检查的列表是有序的,很难插入和删除。因此,半查找法适用于查找变化不频繁的频繁有序列表。首先,假设表格中的元素按升序排列,将表格中间记录的关键字与搜索关键字进行比较,如果相等,则搜索成功;否则,使用中间位置记录将表格分成前后子表;如果中间位置记录的关键字大于搜索关键字,则进一步搜索前一子表;否则,进一步搜索下一个子表。重复上述过程,直到找到满足条件的记录,这样搜索成功,或者直到子表不存在,那么搜索不成功。

  实施二分搜索法

(非递归实现)

  def binary_search_2(alist,Item): 二分搜索法:while版本 n=len(a list)first=0 last=n-1 while first=last:mid=(first last)//2 if a list[mid]==Item:return True elif Item a list[mid]:last=mid-1 else:first=mid 1返回False

(递归实现)

  def binary_search(alist,item): 二分搜索法:递归版本 n=len(a list)if n 0:mid=n//2 if a list[mid]==Item:返回true elif item a list [mid]:返回binary _ search (a list [:mid],item) else:返回binary_search(alist[mid 1:],Item)返回False最佳时间复杂度:O(1)O(1)O(1)O(1)O(1)O(1)O(1)最坏时间复杂度:O(l O g 2n)O(log 2这个数据结构提供了键和值之间的映射关系。只要给一个键,就可以高效的找到它的匹配值,

时间复杂度接近于 O ( 1 ) O(1) O(1)

  哈希表如何根据键快速找到匹配的值?

  Sad池函数哈希表本质上也是一个数组。但是数组只能按照下标访问,比如a[0],a[1],a[2],a[3]和a[4],而哈希表的键主要是基于字符串类型。

  比如以学生的学号为关键字,输入002123,查询霸气鸟或者单词为关键字,输入by,查询数字46.

  所以我们需要一个“中转站”来以某种方式转换键和数组下标。这个中转站被称为sad池函数。

  这种所谓的悲伤池功能是怎么实现的?sad池函数在不同的语言中有不同的实现。这里以python的字典为例,看看sad池函数在python中的实现。

  在python和大多数面向对象的语言中,每个对象都有自己的hashcode,hashcode是区分不同对象的重要标识符。不管对象本身是什么类型,它们的hashcode都是一个整数变量。由于都是整型变量,所以转换成数组下标并不难。转型最简单的方法是什么?它是根据数组的长度取模运算。

  Index=hashcode(Key)% array . length通过sad pool函数,我们可以将字符串或者其他类型的键转换成数组的下标index。

  给定长度为8的数组,当key=001121时,

  index=hashcode( 001121 )% array . length=1420036703% 8=7,当key=this时,index=hashcode( this )% array . length=3559070% 8=6字典读写操作用sad池函数,可以在字典中读写。

  

1.写操作

  写就是将新的键值对插入哈希表(python中的dict)。如果调用dict={002931 :王五 },则意味着插入一个键为002931、值为王五的键-值对。具体应该怎么做?

  第一步,通过sad池函数,将Key转换成数组下标5。

  第二步。如果在数组下标5对应的位置没有元素,就把这个字典填充到数组下标5的位置。

  但由于数组长度有限,当插入越来越多的dict时,不同键通过sad池函数得到的下标可能是相同的。比如002936这个键对应的数组下标是2;02947该键对应的数组下标也是2。

  这种情况叫做伤心池冲突。

  伤心池冲突不可避免。既然无法避免,那就要想办法解决。解决sad池冲突的方法主要有两种,一种是开放式寻址方法,另一种是链表方法。

  开放式寻址方法的原理非常简单。当一个键通过sad池函数获得对应的数组下标已经被占用,我们就可以“另谋高就”,寻找下一个中立位置。

  以上述情况为例。dict6通过sad池函数得到下标2。这个下标在数组中已经有其他元素了,所以后移1位看看下标3在数组中的位置是否空闲。

  不幸的是,下标3已经被占用了,所以向后移动一位,看看下标4在数组中的位置是否空闲。

  幸运的是,数组下标4的位置没有被占用,所以Entry6存储在数组下标4的位置。

  这是开放式寻址的基本思想。当然,当遇到悲伤的池冲突时,有许多方法可以解决它。不一定只是简单的寻找当前元素的下一个元素。这里只是一个简单的例子。

  在python中,开放式寻址方法用于解决冲突。开放式寻址方法也称为封闭式哈希方法。当发生冲突时,python会通过一个二级检测函数F来计算下一个候选索引,如果索引不可用,就会被F再次检测,直到找到可用的位置。

  它被称为封闭哈希方法,因为冲突的元素不会打开额外的存储空间,或者在原始哈希表的空间范围内。

  

2.读操作

  写完了,再说读书。读取就是通过给定的键在哈希表中找到对应的值。

  比如调用dict.get ("002936 "),意思是在哈希表中找到dcit与Key 002936对应的值。

  

3. 扩容

  在解释数组时,引入了数组的扩展。由于哈希表是基于数组实现的,所以哈希表也涉及到扩展的问题。

  首先,什么时候需要扩张?

  当哈希表在多次元素插入后达到一定饱和度时,键映射位置冲突的概率会逐渐增大。这样大量的元素挤在同一个数组下标位置,形成一个长链表,对后续的插入操作和查询操作的性能影响很大。

  这时候就需要对哈希表进行扩展,也就是扩充。

  对于python的哈希表中dict的实现,有两个因素影响其扩展。

  Capacity,即哈希表的当前长度,LoadFactor,即哈希表的填充因子。默认值为0.75f,哈希表的填充因子很容易计算。

  散点图使用数组来存储数据,因此需要计算数组中被占用的位置数。比如下面这个哈希表的填充因子是2/5,也就是0.4。

  填充因子大于1意味着被占用元素的数量超过了数组的长度。一旦填充因子开始增加,你就需要给哈希表增加位置,这叫做调整长度。

  以上是哈希表各种基本操作的原理。因为dict的实现代码比较复杂,所以这里不直接列出源代码。有兴趣的读者可以直接在python中阅读PyDictObject对象的源代码。

  搜索二叉树(二叉查找树)在二叉树的基础上增加了以下条件。

  如果左子树不为空,则左子树中所有节点的值都小于根节点的值。如果右子树不为空,则右子树中所有节点的值都大于根节点的值。左右子树也是二分搜索法树。下图显示了标准的二叉查找树。

  二叉查找树的这些条件有什么用呢?当然是为了方便。

  例如,要查找值为4的节点,步骤如下。

  访问根节点6并发现46。

  访问节点6的左侧子节点3,找到43。

  访问节点3的右子节点4,发现4=4,这正是你要找的节点。

  对于节点分布相对均衡的二叉查找树,如果节点总数为N,那么搜索节点的时间复杂度为O(logn),与树的深度相同。这种通过比较大小来逐步搜索的方式非常类似于二分搜索法算法。

精确搜索算法,搜索简便算法怎么做,快速搜索算法