0%

曲水流觞

哈希结构

昨日夜晚刷完了哈希表的基础章节,不由长舒一口气。哈希函数在应用层和实现底层上,记忆的难度有着云泥之别。首先我们看看我们在什么场景下需要用到哈希表。对于一组数据,它一定具有以下特征:键值、顺序、范围这些。而哈希表最擅长的就是根据键值(key)快速找到对应的数据,它的时间复杂度为O(1),不需要像数组和红黑树一样遍历。
首先要分清楚哈希结构类型,分别为:
1.set(集合)
2.map(映射)
其分别对应于unordered_set和unordered_map。其可以做如下定义:

1
2
3
4
5
6
#include <unordered_map>
#include <unordered_set>

unordered_map<string,int> map;
unordered_set<int> s;

之后就可以做增删改的操作了。这些函数被封装在STL容器操作的底层上,很难被应用层感知。其实现底层主要涉及哈希函数的构造与冲突的解决,主要包括:
1.直接定址法、除留余数法等(构造哈希函数的方法)
2.拉链法(链地址法,解决冲突)
3.开放定址法(解决冲突)
这些方法都是通过底层自动实现的,但是也因此,在低数据量的处理上,要比数组低一点,因此我们要根据数据量的大小灵活选择储存方式。

尾迹

感慨自己从C语言的函数熟悉算法,完成了0到1,pta平台开始刷题,漫无目的地渐渐地熟悉了C语言面向过程的风格,然后开始转向C++这个半路出家的过程,从面向过程转向面向对象,走出了原始的蛮荒,步入了有现成工具可用的文明————虽然还要自己造轮子QAQ。
“咕咕咕~”我抬头,树影婆娑着,地上未干的水渍证明着雨水曾经来过,洋洋的水汽温暖而柔软,天上的啸叫着的铁鸟,拉过长长的白线,那是喷气式发动机的尾迹————正如同夏天的尾迹一般,悠长而又让人心驰神往。