今天忽然想到這個,查了一下,保存保存~~~~
顺序表的查找:
1. 顺序查找
[算法思想]:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。此查找过程可用算法9.1描述之。
有序表的查找:
1. 折半查找算法。先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。
int Search_Bin(SSTable ST,KeyType key){
//在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0。
low=1; high=ST.lenqth; //置区间初值
while (low<=high){
mid = (low+high)/2
if EQ(key, ST.elem[mid].key) return mid; //找到待查元素
else if LT(key, ST.elem.[mid].key) high=mid - 1 //继续在前半区间进行查找
else low = mid+1; //继续在后半区间进行查找
}
return 0; //顺序表中不存在待查元素
} //Search_Bin
静态树表的查找:
已知一个按关键字有序的记录序列:(rl, rl+1, …, rh) (9-8)
其中,rl.key<rl+1.key<…<rh.key
与每个记录相应的权值为:wl, wl+1, …, wh (9-9)
现构造一棵二叉树,使这棵二叉树的带权内路径长度PH值在所有具有同样权值的二叉树中近似为最小,称这类二叉树为次优查找树(Nearly Optimal Search Tree)。它是构造近似最优二叉查找树的有效算法。
构造次优查找树的方法是:
首先在式(9-8)所示的记录序列中取第i(l≤i≤h)个记录构造根结点ri,使得
h i-1
△Pi=|∑wj-∑wj| (9-10)
j=i+1 j=l
取最小值(△Pi=Min{△Pj}),然后分别对子序列{rl,rl+1, …ri-1}和{ri+1,.., rh} 两棵次优查找树,并分别设为根结点ri的左子树和右子树。
索引顺序态树表的查找:
索引顺序表 = 索引 + 顺序表
若以索引顺序表表示静态查找表,则Search函数可用分块查找来实现。分块查找又称索引顺序查找,这是顺序查找的一种改进方法。在此查找法中,除表本身以外,尚需建立一个“索引表” 。
查找方法:
1)由索引确定记录所在区间;
2)在顺序表的某个区间内进行查找。
所以,这也是一种缩小区间的查找方法
#region セットコードのインデックスの探す
/// <summary>
/// セットコードのインデックスの探す
/// </summary>
/// <remarks>
/// セットコードのインデックスの探す。
/// </remarks>
/// <param name="nSetcd">セットコード</param>
/// <param name="mcsArea">受診セット</param>
/// <returns>セットコードのインデックス</returns>
private int GetSetIndex(int? nSetcd,MCheckupSetCL mcsArea)
{
//最小インデックス
int nLow = 0;
//最大インデックス
int nHeight = mcsArea.Count-1;
//中心インデックス
int nMid = 0;
//ECには降順、昇順ですか
bool bASC = false;
//ECが昇順の場合
if (mcsArea[0].Setcd < mcsArea[1].Setcd)
{
bASC = true;
//セットコードが最大値
if (nSetcd > mcsArea[nHeight].Setcd)
{
return nHeight;
}
//セットコードが最小値
else if (nSetcd < mcsArea[0].Setcd)
{
return 0;
}
}
//ECが降順の場合
else
{
//セットコードが最大値
if (nSetcd < mcsArea[nHeight].Setcd)
{
return nHeight;
}
//セットコードが最小値
else if (nSetcd > mcsArea[0].Setcd)
{
return 0;
}
}
while (nHeight>= nLow)
{
//中心値を取得する
nMid = (nLow + nHeight) / 2;
//ECが昇順の場合
if (bASC)
{
if (nSetcd > mcsArea[nMid].Setcd)
{
nLow = nMid;
}
else
{
nHeight = nMid;
}
}
//ECが降順の場合
else
{
if (nSetcd > mcsArea[nMid].Setcd)
{
nHeight = nMid;
}
else
{
nLow = nMid;
}
}
}
return nLow;
}
#endregion