顺序查找表

来源:互联网 发布:linux自带的jdk在哪里 编辑:程序博客网 时间:2024/06/02 06:02
//--search.h
#include<string>typedef int KeyType;//关键字类型//数据元素类型typedef struct{KeyType key;std::string name;}ElemType;//静态查找表结构typedef struct{ElemType * elem;int length;}STable;//顺序查找返待查找元素的位置int search_Seq(STable st, KeyType key);


//--search.cpp 顺序查找,返回待查元素的位置#include"search.h"int search_Seq(STable st, KeyType key){st.elem[0].key = key;   //哨兵int i = 0;for( i = st.length; key != st.elem[i-1].key; --i);return i;}

//--test.cpp#include<iostream>#include"search.h"void main(){const int ElemNumber = 3;ElemType elem[ElemNumber]= {{1,"tian"},{2,"xin"},{3,"world"},} ;STable sTable;sTable.elem = elem;sTable.length = ElemNumber;for(int i = 0; i < ElemNumber; ++i){std::cout<< "请输入第" << i+1 << "个元素的关键字" << std::endl;std::cin >> sTable.elem[i].key;std::cout<< "请输入第" << i+1 << "个元素的姓名" << std::endl;std::cin >> sTable.elem[i].name;}for(int i = 1; i <= ElemNumber; ++i){std::cout<< "第" << i << "个元素的关键字是:"<< sTable.elem[i-1].key<< std::endl;std::cout<< "第" << i << "个元素的名字是:"<< sTable.elem[i-1].name<< std::endl;}int position = search_Seq(sTable, 2);std::cout<< "你查找的是第" << position << "个元素:\n" << std::endl;}

       假设查找表中每个元素被查找的可能性相等,均为 1/n 的时候,顺序查找的平均查找长度为(n+1)/2,即平均每次成功查找到一个元素需要进行(n+1)/2次关键字的比较,这显然是低效的,当n规模很大时,顺序查找的效率将会很低。但是实际应用中,每个元素被查找的可能性肯定是不同的,如果将高频查找元素安排在查找表尾部(从尾部开始查找,当然也可以从头开始查找)那么平均查找长度将会大大减少,所以可以考虑在每一个元素中附设一个访问频度域,并且使顺序表中的元素始终按照访问频度域非递减有序的次序排列,使得查找概率大的元素在查找过程中不断后移,以便在以后的查找中减少比较次数。


0 0
原创粉丝点击