顺序查找法
逐个进行比较。时间复杂度
O
(
n
)
O(n)
O(n)。
二分查找
使用的前提是:数据连续存储且有序。时间复杂度
O
(
l
o
g
n
)
O(logn)
O(logn)。
https://www.nowcoder.com/practice/28d5a9b7fc0b4a078c9a6d59830fb9b9?tpId=49&&tqId=29278&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking
牛客网这个题目多了个条件:若该元素出现多次,请返回第一次出现的位置。
class BinarySearch {
public:
int getPos(vector<int> A, int n, int val) {
if(n==0) return -1;
int left = 0, right = n-1;
int mid;
int index=-1;
while(left <= right){
mid = (left+right)/2;
if(A[mid]==val){
index = mid;
right = mid-1;
}else if(A[mid]>val){
right = mid-1;
}else {
left = mid+1;
}
}
return index;
}
};
大规模数据查找
在大规模数据查找中,大量信息存储在外存磁盘中,B-树和B+树是两种常见的高效外存数据结构。
B-树,也称B树,是一种平衡的多路查找树。
一颗m阶的B-树,满足如下性质:
1)每个节点至多有m棵子树
2)根节点至少有两棵子树
3)除根以外的非叶子节点至少有m/2上取整棵子树
4)所有叶子节点都出现在同一层
5)非叶子节点有n个关键字(有序),那么其子树有n+1棵
B-树的查找和二叉搜索树类似,不同的是要先确定待查找记录所在的节点,然后在节点中查找该记录。
对B-树进行查找包含两种操作:1)在B-树中找节点 2)在节点中找关键字
由于B-树通常存储在磁盘上,则前一查找操作是在磁盘上进行的;后一查找操作是在内存中进行的。在磁盘上找到节点后,将节点中的信息读入内存,然后利用顺序查找或二分查找查询关键字。
B-树的插入操作:首先用查找的方法确定要插入的叶子节点,然后看是否需要分裂,提升。
m阶B-树的生成从空树起,逐个插入关键字。
B-树的删除操作:首先找到要删除的关键字所在的节点,如果不在叶子节点,转换为在叶子节点的情况。
B+树,通常用于数据库和文件系统中。在B+树中,对数据的引用指向叶节点,内部节点的关键字只是充当划分子树的分界值。叶节点被链接成一个序列。
一颗m阶的B+树,满足如下性质:
1)每个节点至多有m棵子树
2)根节点至少有两棵子树
3)除根以外的非叶子节点至少有m/2上取整棵子树
4)所有叶子节点都出现在同一层
5)非叶子节点有n个关键字(有序),那么其子树有n棵
通常在B+树上有两个指针,一个是指向根节点,另一个指向关键字最小的叶节点。
在B+树上进行查找和B-树类似,只是在查找时,无论非叶节点上的关键字是否与给定关键字相同,都要继续查找,直到查找到叶子节点。