一、查找概论
查找的概念也没什么好说的,就介绍几个特殊概念
主关键字:唯一标识一个记录的关键字,对比sql中的主键
次关键字:可以识别多个数据元素的关键字,即并非一一对应的关键字
静态查找表:只做查找,不做其他操作的表
动态查找表:查找的同时,插入或删除数据的表
好了下面进入正题
二、顺序表查找
1,顺序表查找就是最基本的查找技术,从表中的第一个或最后一个元素开始,将表中的元素逐个与进行记录的关键字和给定值进行比较,若比较相同,则查找成功,若比较到尽头都不等,则查找失败
代码实现:
public static int equentialSearch(List list, Object obj){ for (int i = 0; i < list.size(); i++){ if (list.get(i).equals(obj)){ return i; } } return -1; }
查找复杂的表结构时,把你的List换成泛型,或者其他数据结构;写一个comparator或者comparable就可以了。
2,顺序表查找优化
每次查找都要对i是否越界进行判断,是件很麻烦的事。我们用更好的方法,设置一个哨兵。实现如下
public static int enquentialSearch2(List list, Object obj){ list.set(0, obj); int index = list.size(); while (!list.get(index).equals(obj)){ index--; } return index; }
设置了list的0元素作为哨兵。
3,算法分析
顺序查找最好的情况,就是一开始就找到了目标元素,那么时间复杂度是O(1),如果最终才找到,查找次数是n+1,则时间复杂度是O(n),所以平均查找次数是(n+1)/2。即最终时间复杂度还是O(n)。
顺序表查找的显著缺点就是,面对表长很大的情况下,查找效率很低,但好处是,算法简单,对静态查找表没有组织结构的需求。对于这种查找,由于查找概率不同,我们在组织数据时,可以将常用的记录放在前面,不常用的往后面放,效率可大大提高。
4,使用Java8流式编程实现