数据结构中的各种查找---总结篇
2010-11-23 09:08
176 查看
一、基本概念:
1、 列表:待搜索的数据集合。
2、 关键字:要查找的那个数据。
3、 查找:一种算法过程。
二、基于线性表的查找:
1、 顺序查找:
(1)思想:逐个比较,直到找到或者查找失败。
(2)时间复杂度:T(n) = O(n)。
(3)空间复杂度:S(n) = O(n)。
(4)程序:
2、 折半查找:
(1)思想:又称二分查找,对于已经按照一定顺序排列好的列表,每次都用关键字和中间的元素对比,然后判断是在前部分还是后部分还是就是中间的元素,然后继续用关键字和中间的元素对比。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
3、 分块查找:
(1)思想:把无序的列表分成若干子块(子表),然后建立一个索引表,记录每个子块中的某个关键字(最大的数或是最小的数),然后用关键字和这个索引表进行对比。该索引表还存储子块的起始位置,所以可以使用折半查找或者顺序查找确定关键字所在的子块位置。进入子块后,使用顺序查找查找。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:(略)
三、基于树的查找:
1、 二叉排序树:
(1)思想:二叉排序树:①若它的左子树非空,则左子树上所有节点的值均小于它的根节点的值;②若它的右子树非空,则右子树上所有结点的值均大于(或大于等于)它的根节点的值;③它的左、右子树也分别为二叉排序树。查找的时候,中序遍历二叉树,得到一个递增有序序列。查找思路类似于折半查找。
(2)时间复杂度:插入一个节点算法的O(㏒n),插入n个的总复杂度为O(n㏒n)。
(3)空间复杂度:
(4)程序:
2、 平衡二叉排序树:
(1)思想:首先它也是二叉排序树,但是还要具有如下性质:①左子树和右子树的深度之差的绝对值小于等于1;②左子树和右子树也是平衡二叉树。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
3、 B_树:
(1)思想:
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
四、计算式查找:
1、 哈希查找:
(1)思想:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系H,使得p=H(k),H称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为H(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=H(k),从而达到按关键字直接存取元素的目的。难点在于处理冲突的方式:①开放定址法②再哈希法③链地址法④建立公共溢出区。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
对于B_tree查找的方法,我没有深入研究,对此有兴趣或者有研究的同志们,可以给我指点指点,不尽感激。
1、 列表:待搜索的数据集合。
2、 关键字:要查找的那个数据。
3、 查找:一种算法过程。
二、基于线性表的查找:
1、 顺序查找:
(1)思想:逐个比较,直到找到或者查找失败。
(2)时间复杂度:T(n) = O(n)。
(3)空间复杂度:S(n) = O(n)。
(4)程序:
Int SeqSearch(RecordList l, KeyType key) { l.r[0].key = k; I = l.length; while(l.r[i].key != k) i--; return I; }
2、 折半查找:
(1)思想:又称二分查找,对于已经按照一定顺序排列好的列表,每次都用关键字和中间的元素对比,然后判断是在前部分还是后部分还是就是中间的元素,然后继续用关键字和中间的元素对比。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
Int BinSrch(RecordList l, KeyType k) { low = 1; high = l.length; while(low <= high) { mid = (low + high) / 2; if(k == l.r[mid].key) return mid; else if(k < l.r[mid].key) high = mid -1; else low = mid + 1; } return 0; }
3、 分块查找:
(1)思想:把无序的列表分成若干子块(子表),然后建立一个索引表,记录每个子块中的某个关键字(最大的数或是最小的数),然后用关键字和这个索引表进行对比。该索引表还存储子块的起始位置,所以可以使用折半查找或者顺序查找确定关键字所在的子块位置。进入子块后,使用顺序查找查找。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:(略)
三、基于树的查找:
1、 二叉排序树:
(1)思想:二叉排序树:①若它的左子树非空,则左子树上所有节点的值均小于它的根节点的值;②若它的右子树非空,则右子树上所有结点的值均大于(或大于等于)它的根节点的值;③它的左、右子树也分别为二叉排序树。查找的时候,中序遍历二叉树,得到一个递增有序序列。查找思路类似于折半查找。
(2)时间复杂度:插入一个节点算法的O(㏒n),插入n个的总复杂度为O(n㏒n)。
(3)空间复杂度:
(4)程序:
BSTree SearchBST(BSTree bst, KeyType key)//递归算法 { If(!bst) return NULL; else if(bst->key == key) return bst; else if(bst->key > key) return SearchBST(bst->lchild, key); else return SearchBST(bst->rchild, key); } BSTree SearchBST(BSTree bst, KeyType key)//非递归算法 { BSTree q; q = bst; while(q) { If(q->key == key) return q; else if(q->key > key) q = q->lchild; else q = q->rchild; } return NULL; }
2、 平衡二叉排序树:
(1)思想:首先它也是二叉排序树,但是还要具有如下性质:①左子树和右子树的深度之差的绝对值小于等于1;②左子树和右子树也是平衡二叉树。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
3、 B_树:
(1)思想:
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
四、计算式查找:
1、 哈希查找:
(1)思想:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系H,使得p=H(k),H称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为H(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=H(k),从而达到按关键字直接存取元素的目的。难点在于处理冲突的方式:①开放定址法②再哈希法③链地址法④建立公共溢出区。
(2)时间复杂度:
(3)空间复杂度:
(4)程序:
#define m <哈希表长度> #define NULLKEY <代表空记录的关键字值> typedef int KeyType; typedef struct { KeyType key; }RecordType; typedef RecordType HashTable[m]; int HashSearch(HashTable ht, KeyType K) { h0 = hash(K); if(ht[h0].key == NULLKEY) return -1; else if(ht[h0].key == K) return h0; else { for(i = 1; i <= m - 1; i++) { hi = (h0 + 1) % m; if(ht[hi].key == NULLKEY) return -1; else if(ht[hi].key == K) return hi; } return -1; } }
对于B_tree查找的方法,我没有深入研究,对此有兴趣或者有研究的同志们,可以给我指点指点,不尽感激。
相关文章推荐
- 数据结构中的各种查找---总结篇
- 子字符串查找----各种算法总结
- 各种基本数据结构和算法总结清单
- 数据结构中的各种排序---总结篇
- 二分查找各种情况大总结
- 数据结构中排序和查找各种时间复杂度
- 集合框架_集合的特点和数据结构、如何选择使用哪种集合呢、各种集合常见功能和遍历方式总结
- [置顶] 二分查找各种情况大总结
- 数据结构中的各种排序---总结篇
- 各种不常见数据结构总结
- 数据结构大总结系列之折半查找与动态查找树
- 二分查找各种情况大总结
- 数据结构之各种数据结构插入、删除、查找的时间复杂度
- 数据结构之查找总结
- 数据结构各种排序算法总结
- 数据结构中的各种排序总结
- 《数据结构》第七章 查找技术 知识总结导图
- 数据结构回顾和总结(树的各种遍历方法)(2)
- 各种二分查找算法总结
- 数据结构各种排序java实现个人总结