数据结构查找2009级.pptxVIP

  • 0
  • 0
  • 约3.49千字
  • 约 42页
  • 2022-03-20 发布于北京
  • 举报
9.3 哈希表(散列表);9.3 哈希表(散列表);9.3.1 哈希表的有关概念;例:已知某个高级语言的保留字集合为: S = { and, or , not , begin, end, go, if, then, for, do, while repeat,until};; 例9.2 在S中增加3个关键字 else, array, with; ;冲突 不同关键字的哈希地址相同, 即key1?key2,但f(key1) = f(key2); 实际应用中,很难找到不产生冲突的哈希函数 关键字多且复杂; 只知道关键字取值范围, 而不知道确切的关键字; 关键字集合表空间;;采用哈希技术时需要考虑的两个问题 如何构造哈希函数? 如何处理冲突?;9.3.2 哈希函数; 9.3.2 哈希函数;除留余数法 设哈希表表长为m,p为不大于m的素数 哈希函数为 H(key)= key mod p ;9.3.2 哈希函数;直接定址法: 取关键字的某个线性函数作为哈希函数: H(key)= a.key+b ;数字分析法 根据哈希表表长,从关键字中取分布均匀的若干位组成哈希地址。;平方取中法 根据哈希表表长,以关键字平方的中间几位作为哈希地址。;折叠法 将关键码自左到右分成位数相等的几部分(最后一部分位数可以短些),然后将这几部分叠加求和,并按哈希表表长,取后几位作为哈希地址。 两种叠加方法 移位叠加 折叠叠加 ; 0 4 4 2 2 0 3 0 + 6 4 2 5 3 6; 9.3.2 哈希函数;9.3.3 链地址法;9.3.3 链地址法;9.3.3 链地址法-哈希表算法;typedef struct LNode { ElemType data; struct ListNode *next; } LNode *LinkList; typedef struct { LinkList *TheLists; int count; //哈希表当前数据元素个数 int TableSize; }HashTable; typedef LinkList Position; ;void InitializeTable( HashTable HT, int TableSize ) { HT.TableSize = TableSize; HT.count=0; HT.TheLists = (LinkList*) /*Array of LinkList */ malloc( sizeof(LinkList ) * HT.TableSize ); for( i = 0; i HT.TableSize; i++ ) { HT.TheLists[ i ] = (LNode*)malloc( sizeof(LNode)); HT.TheLists[ i ]-next = NULL; } };Position Find( HashTable HT, KeyType key) { L = HT.TheLists[ Hash( key ) ]; p=L-next; while( p != NULL p-data.key != key ) p= p-next; return p ; } ;int Insert( HashTable HT, ElemType e) { if (!Find_I_D(HT,e.key, pre, p )) { /* e.key is not found, then insert */ s = ( LNode*) malloc(sizeof( LNode ) ); s-data = e; /* Probably need strcpy! */ s-next = pre-next; pre-next = s; HT.count++; return 1; } else return 0; };int Delete( HashTable HT, KeyType key) { if (Find_I_D(HT,key, pre, p )) { /* key is found,

文档评论(0)

1亿VIP精品文档

相关文档