静态查找表

顺序查找

有序查找

折半查找(binary search)

判定树 折半查找只适用于有序表,且限于顺序存储结构(对线性链表无法有效的进行折半查找)

斐波那契查找:根据斐波那契序列的特点进行分割,假设开始时表中记录个数比某个斐波那契数小1即

n=fu-1,然后将给定值key和 [fu -1 ].key 进行比较,若想等则查找成功; 若key<[fu-1].key 继续自

elem[1]到elem[fu-1 - 1 ]的子表进行查找,否则继续在自elem[fu-1 + 1]至elem[fu - 1]的子表中进行

查找,后一子表的长度为fu-2 -1。斐波那契查找的平均性能比折半查找好,但最坏情况比折半查找差

静态树表查找

对于查找表的查找概率不等时引入的静态树表查找。

静态最优查找树(static optimal search tree)

近似最优查找树(nearly optimal search tree)

序列(rl,rl + 1, ..., rn)

其中 r1.key < rl+1 . key  < .... < rh.key

与每个记录对应的权值

wl,wl+1,...,wh

现构造一颗二叉树,使这棵二叉树的带权内路径长度PH值在所有具有同样的权值的二叉树中

近视为最小,称这类二叉树为次优先查找树(nearly optimal search tree)

void SecondOptimal(BiTrre& T,ElemType R[], float sw[],int low,int high){

i=low; min=abs(sw[high]-sw[low]); dw=sw[high]+sw[low-1];

for ( j=low+1; j<=high; ++j)

{

if(abs(dw-sw[j]-sw[j-1]) < min {

i=j; min=abs(dw-sw[j]-sw[j-1]);

}

T = (BiTree)malloc(sizeof(BiTNode));

T->data = R[i];

if (i==low) T->lchild = NULL;

else SecondOptimal(T->lchild,R,sw,low,i-1);

if(i==high) T->rchild=NULL;

else SecondOptimal(T->rchild,R,sw,i+1,high);

}

typedef BiTree SOSTree;

status CreateSOSTree(SOSTree & T, SSTable ST) {

if(ST.length == 0 ) T=NULL;

else {

FindSW(sw,ST); // 按照由有序表ST中各数据元素的weight域求累计权值表sw.

SecondOptimal(T,ST.elem,sw,1,ST.length);

}

return OK;

}

由于在次优先查找树的过程中,没有考虑单个关键字的相应权值,则有可能出现被选为根的关键字

的权值比与它相邻的关键字的权值小.此时应当适当的调整:选临近的权值较大的关键字作为次优先查找树的根结点.

索引顺序表的查找

分块查找

表有序或者分块有序. 所谓"分块有序" 指的是第二个子表中所有记录的关键字均大于第一个表中的最大关键字.

第三个子表的所有关键字均大于第二个表中的最大关键字,...,依次类推.

结构索引表和块表 每个索引项包括关键字项和指针项.

查找分2部,先查找子快,在子表中顺序查找.

比顺序查找快,不及折半查找.

动态查找表

二叉排序树,平衡二叉树(Binary sort tree)

二叉排序树或者是一颗空树;或者具有下列性质的二叉树:(1)若它的左子树不空,则左子树上

所有节点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有的结点的值均大于

它的根节点的值;(3)它的左右子树也分别为二叉排序树。

BiTree SearchBST(BiTree T, KeyType key)

{

if((!T) || EQ(key,T->data.key)) return (T);

else if LT(key,T->data.key) return (SearchBST(T->lchild,key));

else return (SearchBST(T->rchild,key));

}

二叉排序树的插入/删除

与次优二叉树不同的是二叉排序树是查找过程中动态生成的。

Status SearchBST(BiTree T, KeyType key,BiTree& p)

{

if((!T) || EQ(key,T->data.key)) return (p=T,return TRUE);

else if LT(key,T->data.key) return (SearchBST(T->lchild,key,p));

else return (SearchBST(T->rchild,key,p));

}

Status InsertBST(BiTree & T,ElemType e)

{

if(!SearchBST(T,e.key,NULL,p) {

s = (BiTree)malloc(sizeof(BiTNode));

s->data = e; s->lchild = s->rchild = NULL;

if (!p) T = s;

else if LT(e.key,p->data.key) p->lchild = s;

else p->rchild = s;

return TRUE;

}

else return FALSE;

}

二叉排序树的删除

分三种情况讨论

(1)若*p结点为叶子结点,即PL和PR均为空树,由于删去叶子节点不破坏整个树结构,

则只需修改双亲节点的指针即可。

(2)若*p结点只有左子树PL或只有右子树PR,此时要另PL或PR直接成为其双亲节点的*f的左子树即可。

(3)若*p结点的左子树和右子树均不空。显然,此时不能如上简单处理。有2种做法

一,另*p的左子树为*f的左子树,而*p的右子树为*s的右子树。

二,另*p的直接前驱(或直接后继)代替*p ,然后从二叉排序树中删去它的直接前驱(或直接后继)

Status DeleteBST(BiTree & T, KeyType key) {

if(!T) return FALSE;

else {

if(EQ(key, T->data.key)) {return Delete(T)};

else if(LT(key,T->data.key)) return DeleteBST(T->lchild,key);

else return DeleteBST(T->rchild,key);

}

}

Status Delete(BiTree & p) {

if (!p->rchild) {

q = p; p = p->lchild; free(q);

}

else if (!p->lchild) {

q = p; p = p->rchild; free(q);

}

else {

q = p; s = p->lchild;

while(s->rchild) {q = s; s = s->rchild;} //左转,然后向右走到尽头

p->data = s->data;                   //s指向被删节点的前驱

if(q != p)  q->rchild = s->lchild;  //重接*q的右子树

else q->lchild = s->lchild;         //重接*q的左子树

delete s;

}

reutrn TRUE;

}

时间: 2024-08-09 14:01:32

静态查找表的相关文章

数据结构:静态查找表

数据结构:静态查找表(C语言版) 1.写在前面 ?从查找说起: 在英汉字典中查找某个英文单词的中文解释:在新华字典中查找某个汉字的读音.含义:在对数表.平方根表中查找某个数的对数.平方根:邮递员送信件要按收件人的地址确定位置等等. 从计算机.计算机网络中查找特定的信息,就需要在计算机中存储包含该特定信息的表.查找是许多程序中最消耗时间的一部分.因而,一个好的查找方法会大大提高运行速度. ?先讨论静态查找表: 静态查找表应该是查找中最为简单的.仅仅是在固定的表中对元素的查找,而不涉及修改表中的元素

算法学习之查找算法:静态查找表(2)有序表查找

如果静态查找表是一个有序表,则可以使用折半查找. 折半查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止.折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止. 关键字key与表中某一元素array[i]比较,有3种情况: 1.key==array[i],查找成功 2.key > array[i],待查找元素可能的范围是a

静态查找表:顺序查找、折半查找、分块查找

引言: 除去各种线性和非线性的数据结构外.另一种在实际应用中大量使用的数据结构--查找表.查找表是由同一类型的数据元素构成的集合. 对查找表常常进行的操作有:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素.对查找表仅仅作前两种统称为"查找"的操作,则称此类查找表为静态查找表. 若在查找过程中同一时候插入查找表中不存在的数据元素,或者从查找表中删

算法学习之查找算法:静态查找表(1)顺序表查找

引言: 对查找表一般的操作有:1.查询某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素. 静态查找表的操作只包括两种:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性: 静态查找表又有四种表现形式:顺序表的查找.有序表的查找.静态树的查找.索引顺序表的查找. 静态查找涉及的关键字类型和数据元素类型

数据结构算法C语言实现(三十二)--- 9.1静态查找表

一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 1 /** 2 author:zhaoyu 3 date:2016-7-12 4 */ 5 #include "6_3_part1_for_chapter9.h" 6 typedef struct { 7 int key; 8 }SElemType; 9 //静态查找表的顺序储存结构 10 #define ElemType SElemType 11 #define K

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

c语言描述的静态查找表

顺序表的查找: 直接循环依次和目标比较就行 有序表的查找(二分查找): int search(SS *T,Type key){ int mid; int low=1; int high=T.length; while(low<=high){ mid=(low+high)/2; if(T.elem[mid]<key){ low=mid+1; }else{ high=mid-1; } } return high; } 二叉树表的查找:返回从上到下从左到右的序号(层序遍历,也可以用栈非递归遍历):

数据结构 - 静态查找

查找 主要讨论顺序表.有序表.索引表和哈希表查找的各种实现方法,以及相应查找方法在等概率情况下的平均查找长度. 查找表(Search Table):相同类型的数据元素(对象)组成的集合,每个元素通常由若干数据项构成. 关键字(Key,码):数据元素中某个(或几个)数据项的值,它可以标识一个数据元素.若关键字能唯一标识一个数据元素,则关键字称为主关键字(Primary Key) :将能标识若干个数据元素的关键字称为次关键字(Secondary Key) . 查找/检索(Searching):根据给

查找表

基本概念: 查找表:由同一类型的数据元素(或记录)构成的集合. 关键字(键):用来表示数据元素的数据项成为关键字,简称键,其值称为键值 主关键字:可唯一标识哥哥数据元素的关键字 查找:根据给定的某个K值,再查找表寻找一个其键值等于K的数据元素. 静态查找表:进行的是引用型运算 动态查找表:进行的是加工型运算 静态查找表: 查找表用顺序表表示:(见P163)const int maxsize=20 //静态查找表的表长typedef struct {TableElem elem[maxsize+1