《算法图解》chap5 散列表

Posted huangyilong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法图解》chap5 散列表相关的知识,希望对你有一定的参考价值。

线索Cues 笔记Notes
  •  散列表的内部机制(实现,冲突,散列函数)
  • 应用案例

 

 一、散列表=散列函数+数组

  • 散列函数特点:
  1. 将相同的输入映射到相同的数字
  2. 将不同的输入映射到不同的数字,但其实这样的函数几乎不会存在。所以会有冲突的存在:两个键分配的位置相同。
  3. 知道数组有多大,只返回有效的索引
  • 散列表是由键和值组成的。
  • 冲突的处理方式,当两个键映射到同一个位置,就在这个位置存储一个链表。

二、

  1. 查找某人的电话号码
  2. 投票,一人只能投一次。如果没有投过票就投票成功并且保存。投过就不让投
  3. 缓存:网站将数据记住,而不再重新计算。当你访问页面时它首先检查散列表是不是存储了该页面,如果没有就存储,否则就直接返回。
Codes
 
 1 voted=
 2 def check_voter(name):
 3     #如果有人要投票,投过了就不给投,否则就让他们投
 4     if voted.get(name):
 5         #先判断有没有在voted里面,如果没有就存进去并且允许投票
 6         
 7         print("kick them out")
 8     else :
 9         voted[name]=True
10         print ("let them vote!")
11 
12 check_voter("tom")
13 check_voter("tom")

迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器,来遍历访问这个容器里面的元素

 

unordered_map的迭代器是一个指针,指向这个元素,通过迭代器来取得它的值

1 unordered_map<Key,T>::iterator it;//
2 (*it).first;             // the key value (of type Key)
3 (*it).second;            // the mapped value (of type T)
4 (*it);                   // the "element value" (of type pair<const Key,T>) 

 

它的键值分别是迭代器的first和second属性。 

1 it->first;               // same as (*it).first   (the key value)
2 it->second;               //same as (*it).second   (the mapped value)

 

#include <iostream>
#include <unordered_map>
//使用散列表时需要包含此散列表<unordered_map>
#include <string>
using namespace std;


unordered_map<string, bool> voted;
//定义一个散列表名为voted,用于储存已经投过票的人的名字,其中键是字符串类型,值是bool类型

void check_voter(const string& name) 
    //检查该名字是否投过票,没有投票就投票并保存,有就不允许投票
    auto search = voted.find(name);
    //自动定义类型;find()是通过给定主键查找元素,没找到:返回unordered_map::end
    if (search == voted.end() || search->second == false) 
        //没找到或者找到了但是值是false, search->second(the same as (*search).second)就插入
        voted.insert( name, true );
        //
        cout << "Let them vote!" << endl;;
    
    else 
        cout << "Kick them out!" << endl;
    


int main() 
    check_voter("tom");
    check_voter("mike");
    check_voter("mike");

 

 1 #include <utility>
 2 using namespace std;
 3 
 4 using std::cout;
 5 using std::endl;
 6 
 7 int main() 
 8     std::unordered_map<std::string, float> book = 
 9         "apple", 0.67,
10         "milk", 1.49,
11         "avocado", 1.49
12     ;
13     //初始化一个散列表
14 
15     // print book
16     for (std::pair<std::string, float> pair : book) 
17         //pair:objects that can hold two values of different types 
18         cout << pair.first << ": " << pair.second << "$" << endl;
19     
20     //print book遍历的三种方式
21     for (auto it = book.begin(); it != book.end(); ++it)
22     
23         cout << it->first << ":" << it->second<<"$"<<endl;
24     
25     for (auto it = book.begin(); it != book.end(); it++)
26     
27         cout << (*it).first << ":" << (*it).second << "$" << endl;
28     
29          
30   
31     
32 

 

以上是关于《算法图解》chap5 散列表的主要内容,如果未能解决你的问题,请参考以下文章

《算法图解》代码实现和改进

算法作业13——《算法图解》读书笔记

推荐书籍:《算法图解》

《算法图解》第五章笔记与课后练习

《算法图解》[美] Aditya Bhargava(作者)epub+mobi

《图解算法》--二分查找选择排序递归