查找算法
静态查找:数据集合稳定,不需要添加,删除元素的查找操作
动态查找:数据集合在查找的过程中需要同时添加或删除元素的查找操作
查找结构:
静态查找,可以用线性表结构组织数据,使用顺序查找算法;对关键字进行排序,则可以使用折半查找算法或斐波那契查找算法来提高查找的效率。
动态查找:使用二叉排序树的查找技术,还可以用散列表结构来解决查找问题
顺序查找:
for(i=0;i<n;i++)
{
if(a[i]==key)
{
return i;
}
}
优化:把a[0]当成哨兵,只需要比较n次,上述算法需要比较2n次
a[0]=key;
i=n;
while(a[i]!=a[0])
{
i--;
}
return i
折半查找:
根据折半查找(效率为log2n)修改过来 low high,low=mid+1;mid=(low+high)/2
int low,high,mid;
low=0;high=n-1;
while(low<high)
{
mid=(low+high)/2;
if(key<str[mid])
{
high=mid-1;
}
if(key>str[mid])
{
low=mid-1;
}
else
{
return mid;
}
}
return -1;
插值查找(按比例查找):
mid=low+((key-a[low])/(a[high]-a[low]) )*(high-low);
斐波那契查找(黄金分割法查找)0.618:
线性索引查找:
稠密索引:应用数据量不是很大的
分块索引:各块间有排序,块内无序 存储空间换时间
倒排索引:搜索引擎的查找方式
二叉排序树:
二叉树具有的性质:
- 若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值;
- 若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值;
- 它的左右子树也分别为二叉排序树(递归)。
平衡二叉排序树(self-Balanceing Binary Search Tree Height-Balanced Binary Search Tree)
要求:左右子树的高度最多相差1;平衡因子的绝对值小于1。
构造平衡二叉树的目的是为了避免构成极端的效率低下的二叉树查找
这个不是平衡二叉树,顶点9的左子树比右子树高2;
这个是平衡二叉树。