码迷,mamicode.com
首页 > 编程语言 > 详细

《算法图解》chap5 散列表

时间:2019-09-06 18:48:49      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:存储   auto   通过   util   space   diff   访问   namespace   分配   

线索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 散列表

标签:存储   auto   通过   util   space   diff   访问   namespace   分配   

原文地址:https://www.cnblogs.com/huangyilong/p/11474231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!