[数据结构]查找
查找概念
查找表:由同一类型的数据元素构成的集合。
查找表按照操作的方式分为两大种:静态查找表和动态查找表。
静态查找表:只作查找操作的查找表,它的主要的操作有:
查找某个“特定的数据元素”
动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。动态查找表的操作:
查找时插入数据和查找时删除数据
对于静态查找表来说,可以应用线性表结构来组织数据,这样可以使用顺序查找算法。如果再对主关键字排序,则可以应用折半查找等技术进行高效的查找。
对于动态查找,则要考虑二叉排序树的查找技术。
静态表查找
顺序表查找
顺序查找:从表中的第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,如果某个记录的关键字和给定值相等,则查找成功。如果直到最后一个(或第一个)记录,其关键字和给定值比较都不相等,则查找不成功。
int Sequential_Search(int *a, int n, int key) { int i; for(i = 1; i <= n; i++) { if(a[i] == key) { return i; } }//for return 0; }
但是这个算法是可以改进的,上面看到每向后移动一个元素后,都要比较当前的索引和数组的个数,防止越界。事实上,可以设置一个哨兵,这样就不需要每次让i与n作比较了。
/*有哨兵的顺序查找,查找成功返回下标,不成功返回0*/ int Sequential_Search2(int *a, int n, int key) { int i = n; a[0] = key; //设置a[0]为关键字,称之为哨兵 while(a[i] != key) { i--; } return i; }
这种在查找方向的尽头设置哨兵的方法,避免了在查找过程中每次比较后都要判断查找位置是否越界。在数据量较多时,效率提高很大,是非常好的编程技巧。
折半查找
在有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功。若给定值小于中间记录,则在中间记录的左半区继续查找;若给定值大于中间记录,则在右半区查找。