7 查找 (4)

16
数数数数 --- 数数 7 7 数数 数数 (4) (4)

Upload: jael-newton

Post on 03-Jan-2016

80 views

Category:

Documents


2 download

DESCRIPTION

7 查找 (4). 教学目标. 1 、掌握查找的概念,熟练掌握顺序表和有序表(折半查找)的查找算法及其性能分析方法; 2 、掌握二叉排序树的概念,熟练掌握二叉排序树的构造和查找算法及其性能分析方法; 3 、掌握二叉排序树的插入算法,二叉排序树的删除方法; 4 、掌握平衡二叉树的概念,掌握平衡化二叉树的方法; 5 、掌握哈希查找的概念,掌握哈希函数(除留余数法)的构造。 6 、掌握用线性探测法和链地址法解决冲突的方法,并能进行查找长度的计算。 7 、熟悉标准模版库 STL 中的相关知识。. 7 查找. 7.1 静态查找表 7.2 动态查找表 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 7   查找 (4)

数据结构 ---查找

7 7 查找查找 (4)(4)

Page 2: 7   查找 (4)

数据结构 ---查找

1 、掌握查找的概念,熟练掌握顺序表和有序表(折半查找)的查找算法及其性能分析方法;

2 、掌握二叉排序树的概念,熟练掌握二叉排序树的构造和查找算法及其性能分析方法;

3 、掌握二叉排序树的插入算法,二叉排序树的删除方法;4 、掌握平衡二叉树的概念,掌握平衡化二叉树的方法;5 、掌握哈希查找的概念,掌握哈希函数(除留余数法)的构

造。6 、掌握用线性探测法和链地址法解决冲突的方法,并能进行

查找长度的计算。7 、熟悉标准模版库 STL 中的相关知识。

1 、掌握查找的概念,熟练掌握顺序表和有序表(折半查找)的查找算法及其性能分析方法;

2 、掌握二叉排序树的概念,熟练掌握二叉排序树的构造和查找算法及其性能分析方法;

3 、掌握二叉排序树的插入算法,二叉排序树的删除方法;4 、掌握平衡二叉树的概念,掌握平衡化二叉树的方法;5 、掌握哈希查找的概念,掌握哈希函数(除留余数法)的构

造。6 、掌握用线性探测法和链地址法解决冲突的方法,并能进行

查找长度的计算。7 、熟悉标准模版库 STL 中的相关知识。

教学目标

Page 3: 7   查找 (4)

数据结构 ---查找

7 7 查找查找

7.1 静态查找表7.2 动态查找表7.3 哈希表7.4 查找与标准模版库 STL

Page 4: 7   查找 (4)

数据结构 ---查找

回顾和复习1)哈希查找的理想查找长度?2)影响哈希查找 ASL的因素有哪些?3)哈希表处理冲突的方法主要有哪几种?

Page 5: 7   查找 (4)

数据结构 ---查找

7.4

查找与标准模版库 STL

Page 6: 7   查找 (4)

数据结构 ---查找

四种关联容器 集合 set 映射 map 多重集合 multiset 多重映射 multimap

头文件分别为: set和 map

Page 7: 7   查找 (4)

数据结构 ---查找

C++ STL 中标准关联容器 set, multiset, map, multimap 内部采用的就是一种非常高效的平衡检索二叉树:红黑树(Red-Black Tree) 。红黑树的统计性能要好于一般的平衡二叉树,所以被 STL 选择作为了关联容器的内部结构。显然, set和 map 均自动排序(因为检索二叉树具有排序的特点) set 是集合。set 的特性是集合的基本特性:元素唯一性等。通过 algorithm 中提供的includes、 set_intersection、 set_union、 set_difference 等四个函数,可以方便的实现集合的包含判断、交、并、差等操作。下面是部分参考用法:

Page 8: 7   查找 (4)

数据结构 ---查找

#include<set>#include<algorithm>using namespace std;int main(){

int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, b[] = { 3, 6, 8, 9 };set<int> Sa(a, a+9); set<int> Sb(b, b+4);set<int> Su, Si, Sd;//交集set_intersection( Sa.begin(), Sa.end(), Sb.begin(),Sb.end(), inserter(Si,Si.begin()) );//并集set_union( Sa.begin(), Sa.end(), Sb.begin(), Sb.end(), inserter(Su, Su.begin()) );//差集set_difference( Sa.begin(), Sa.end(),Sb.begin(), Sb.end(), inserter(Sd, Sd.begin()) );// 集合包含判断bool flag=includes(Sa.begin(), Sa.end(),Sb.begin(), Sb.end());for(set<int>::iterator it=Si.begin();it!=Si.end();it++) cout<<*it;return 0;

}

Page 9: 7   查找 (4)

数据结构 ---查找

map 简介 map 是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改 Value 值,而不能修改key 。

map 的功能 •自动建立 Key - value 的对应。 key 和 value 可以是任意你需要的类型。 •根据 key 值快速查找记录,查找的复杂度基本是 Log(N) ,如果有 1000个记录,最多查找 10 次, 1,000,000 个记录,最多查找 20 次。 •快速插入 Key - Value 记录。 •快速删除记录 •根据 Key 修改 value 记录。 •遍历所有记录。

Page 10: 7   查找 (4)

数据结构 ---查找

在map 中插入元素 改变 map 中的条目非常简单,因为 map 类已经对 [] 操作符进行了重载 enumMap[1] = "One";enumMap[2] = "Two";或enumMap.insert(map<int, string> :: value_type(2, "Two"))

查找并获取 map 中的元素 下标操作符给出了获得一个值的最简单方法: string tmp = enumMap[2]; 但是 , 只有当 map 中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。 对这个问题,我们可以使用 find()和 count() 方法来发现一个键是否存在。

Page 11: 7   查找 (4)

数据结构 ---查找

从map 中删除元素 移除某个 map 中某个条目用 erase() 该成员方法的定义如下 iterator erase(iterator it); // 通过一个条目对象删除 iterator erase(iterator first, iterator last);        // 删除一个范围 size_type erase(const Key& key); // 通过关键字删除

Page 12: 7   查找 (4)

数据结构 ---查找

#include<map>#include<algorithm>int main(){ map<string, int> m; map<string, int>::iterator iter; string s; while(cin>>s) {

m[s]++; //很重要的一种插入元素的方法,下标法m.insert( make_pair(“hello”, 1) ); //插入元素的另一种办法for(iter = m.begin(); iter != m.end(); ++iter) cout << iter->first << " " << iter->second << endl; //读取元素的办法

iter = m.find("hello"); // 查找元素的方法 find函数,注意检测的办法if(iter != m.end()) cout << "yes, found it" << endl;

m.erase(iter); // m.erase("world");//查找元素的方法 count函数,返回 1或者 0,表示有或无if(m.count("world")==0) cout << "error" << endl;

} return 0; }

Page 13: 7   查找 (4)

数据结构 ---查找

内容 要求顺序查找的方法 掌握二分查找的方法 熟练掌握顺序查找、二分查找的算法 熟练掌握计算顺序查找、二分查找的平均查找长度 熟练掌握分析顺序查找、二分查找的时间复杂度 掌握静态查找树表 课外了解二叉排序树的概念 熟练掌握二叉排序树插入节点的方法 熟练掌握二叉排序树删除节点的方法 基本掌握二叉排序树的查找方法和算法 熟练掌握插入二叉排序树中结点的算法 基本掌握删除二叉排序树中结点的算法 了解

本章要求:

Page 14: 7   查找 (4)

数据结构 ---查找

内容 要求平衡二叉树的的概念 掌握平衡化二叉树的方法 掌握B 树、 B+ 树、键树 课外了解哈希查找的概念 掌握常用的哈希函数的构造方法 掌握用线性探测法和链地址法解决冲突的方法 熟练掌握计算线性探测法和链地址法的平均查找长度(含查找失败) 熟练掌握哈希表的查找算法和插入算法 ( 开放定址 ) 基本掌握

本章要求(二)

Page 15: 7   查找 (4)

数据结构 ---查找

课后建议:

HLoj 8871~8877 HDoj 1563, 2095 , 1029( Hash ) HDoj 1880( Hash ,但内存限制,需要考虑变通) Poj 2418( BST 或 Hash ) Zoj 1899( Hash ) Zoj 1109( BST 或 Hash )

注意收集各类高效 hash 函数 熟悉并尝试使用 STL 中的查找算法

如: binary_search(A, A + N, value)

最新的 STL 已经支持 Hash 结构,但 VC6.0 不支持

Page 16: 7   查找 (4)

数据结构 ---查找

推荐 2 个经典字符串 hash 函数unsigned int Hash1(string s) { // zoj 1899 约 4000ms AC

unsigned int h = 0;for(int i=0; i<s.size(); i++) {

h = 31 * h + s[i];}return h % MaxN; // MaxN 就是除留余数法中的 p

}

unsigned int Hash2(string s) { // 大量采用位运算以提高效率 unsigned int h = 0; for(int i=0; i<s.size(); i++){

h = (h << 4) + s[i]; unsigned int g = h & 0Xf0000000L;if ( g ) h ^= g >> 24;h &= ~g;

} return h % MaxN;}