一 . 静态查找表
1. 顺序查找
算法思想:从表中第一个记录开始,逐个进行记录的关键字和给定值进行比较,若某个记录的关键字和给定值比较相等,则查找成功;反之,若直至最后一个记录,其关键字和给定的值都不想等,则表明表中没有所查找的记录,查找失败。
性能:平均查找长度ASL=(n+1)/2
2. 二分查找(折半查找) --------前提必须是有序表,性能只有在均匀分布的时候才是最优的。
算法思想:先确定待查记录所在的范围,然后逐步缩小范围直到找到或者没有找到记录为止。
int bin_search(elemtype s[], keytype k, int n)
{
int low, mid, high;
low = 0;
high = n - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (s[mid].key == k)
{
return mid; //搜索成功
}
else if (s[mid].key < k)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
} //end while
return -1; //搜索不成功
}
该查找算法适用于有序数组,对于无序数组可以先排序在用此算法。
分析:设待查元素所在区域的下界为low, 上界为high,则中间位置为mid=(low+high)/2.
若此元素关键字值等于给定值k,则查找成功;
若此元素关键字值小于给定值,则在区间mid+1~high内进行二分查找;
若此元素关键字值大于给定值,则在区间low~mid-1内进行二分查找;
性能:二分查找的效率比顺序查找高,ASL=log2(n+1)-1
二. 哈希查找
哈希查找是通过计算数据元素的存储地址进行查找的一种方 法。
哈希查找的操作步骤: ⑴用给定的哈希函数构造哈希表; ⑵根据选择的冲突处理方法解决地址冲突; ⑶在哈希表的基础上执行哈希查找。
//根据关键字和哈希函数,建立哈希表,基于线性探测再散列解决冲突方法
void BuildHashTable(int * pKeyArry, int * pHashTable, int len)
{
int * pKey = pKeyArry;
int * pHash = pHashTable;
bool *pFlag = new bool[len]; //标识哈希地址是否已占用
memset(pFlag, false, len);
int imod;
while (pKey != (pKeyArry + len))
{
imod = *pKey % len;
while (true)
{
if (false == pFlag[imod])
{
pHash[imod] = *pKey;
pFlag[imod] = true;
break;
}
else
{
++imod;
imod %= len;
}
}
++pKey;
}
delete [] pFlag;
}
//哈希查找
bool HashSearch(int * pHashTable, int iKey, int len)
{
int *pHash = pHashTable;
int addr = iKey % len;
for (int i = 0; i < len; i++)
{
if (pHash[addr] == iKey)
{
return true;
}
else
{
++addr;
addr %= len;
}
}
return false;
}