常用的查找算法

来源:互联网 发布:地下城与勇士java 编辑:程序博客网 时间:2024/04/30 08:06

记录自己笔试用遇到的常用的查找算法。

1.顺序查找法:这个没什么说的,无非是遍历比较找出关键字

2.折半查找法:建立在数据有序(升序)的基础上,设列表arr长度为n,初始表头为low,表尾为high,中间值用mid表示。k为关键字的值。

1).mid=(low+high)/2

2).当k>arr[mid]时,low = mid+1,并重复1).

     当k<arr[mid]时,high = mid -1,并重复1);

     当k=arr[mid]时,找到,结束。

直到low>high,还没找到那么说明该关键字不存在。

核心代码实现:

int low = 0; int high = t.length-1;int mid = 0;while(low>high){mid = (low+high)/2;if(k>t[mid]){low = mid+1;}else if(k<t[mid]){high = low+1;}else{return mid } }return -1;


3.分块查找法:又名索引顺序查找法,要求将待查元素均匀地分成块,块间按大小排序,块内不排序,因此需要建立一个块最大(最小)关键字表,称之为索引表。

算法步骤:1).第一步确定查找节点在那个表中的那一块。

    2)第二步在确定的块中找到该节点。

4.Hash查找法:又名散列法,利用hash表的结构去查找。此法主要是解决链各个条件。

1):哈希函数的构造(列举常用的)

(1).自身函数:关键字自身作为hash函数,h(k) = k,也可以加上一个常数h(k) = k+c;

(2).除余法:选择一个适当的正整数m,使用关键字对m求余,作为关键字,即h(k) = key%m。

(3).数字分析法:对关键字内部代码的各个码位进行分析,取较为出现次数较为平均的,需要实现知道关键字内部的码位,所以限制极大。

(4).平法区中法:先将关键字取平方,然后取中间几位作为地址,位数可以根据要求的地址范围来确定。

 

2):冲突处理

(1).线性探测法:当通过hash函数计算的地址有值时,将关键字+1,再去利用hash函数求得地址,重复上述过程,直到地址位置不为空。

(2).溢出区法:(1)方法,可能会造成连锁反应,增大了冲突发生的机会。溢出区办法是,当发生冲突时,将发生冲突的关键字放入溢出区中。(可以形成多级散列)

(3).链地址法:将相同散列地址的节点连接在同一个链表中,从而形成n条链,使用一个数组ht存储各链表的链头指针。


0 0
原创粉丝点击