一、顺序查找 原理:通过穷举来找集合中某个元素,从第一个开始找,依次检查每个元素,一直到匹配到元素或者找寻到集合结尾未找到。因此最好的情况是需要找到的在第一个 ,最坏的是在最后一个,平均情况就是在中间。
使用环境:对集合中元素情况了解较少,能找到集合下一个元素,元素可以只要能进行比较即可,不要求集合是否有序。对应JAVA语言中的循环遍历。
对顺序查找的优化: 1.查到一个元素之后把他放在首位,(这样默认查到的都是常用的)。2.查到一个元素往前移动一位,这样经过一段时间使用该集合,该集合经常被访问的元素在集合前部分。3,如果不经常被查到的元素 某此被查找的则移动到集合尾部
二、二分查找 原理:首先查找集合中间的元素,再比较中间元素与目标元素的大小,若中间元素小的话那么查找中间元素与尾部元素之间,在这个区域选择中间元素与目标进行对比。依次类推 使用:有序,自然排序的集合。元素需要实现比较大小接口功能。
JAVA例子:public class BinarySearch>{public boolean serarch (T[]collection , T target){if(target==null){return false;}int low = 0,high=collection.length-1;while(low<=high){int t = (low+high)/2;int cr = target.compareTo(collection[t]);if(cr<0){//目标小于collection[t]high = t-1;}else if(cr>0){//目标大于collection[t]low = t+1;}else{return true;}}return false;}}
三、散列查找 散列查找是依据散列算法进行的查找。 对于一个集合,我先把集合依据hash值,分为几个桶,相同hash的放在相同的桶中。桶中的元素按照链表方式进行存储。查找时首先遍历桶,对比hash值,确定桶位置再 进行元素的对比。针对的是较大数据的查询,并且数据是无序的。对应JAVA中的HashMap HashSet 。
四、二叉树查找 一个父节点,每个节点上有两个子节点,其中左侧子节点小于父节点,右侧大于父节点,依次类推。
对于动态的集合二叉树使用一段时间,经过元素的插入,删除,修改等操作后容易产生二叉树的偏移,也就是二叉树不再是比较对称均衡的。最极端的情况是变成了链表。因此在使用过程中需要对二叉树进行维护,常用高效的维护方案是红黑树 和平衡二叉树。
二叉树查找的基本规律与二分查找是一样的。由于元素在添加到二叉树中时已经进行了节点排序维护,所以查询效率很高。 在JAVA的集合中有TreeSet 和TreeMap 根据二叉树原理的集合。 待学习:二叉树如何遍历???