算法神经元

119 阅读3分钟

个人学习

勿喷

4.散列函数(主要注意映射)

散列函数“将输入映射到数字”,保证每个输入映射出来的都是独特的数字

散列函数知道数组有多大,只返回有效的索引。如果数组包含5个元素,散列函数就不会返回无效索引100。

用于缓存

缓存/记住数据,关于映射关系来查找,并且还要判断是否重复。

冲突

散列表总是将不同的键映射到数组的不同位置,,比如我给定应该26个位置的数组

我的散列表是按字母表顺序来分配数组

比如

Apple 自动分配的第一个位置

BANANAS 分配到第二个位置

AYOCADOS 这个时候会和Apple冲突,发生替代

解决方法:如果2个键位映射到了同一个位置,在这个位置储存一个链表

但 :如果散列表存储的链表很长,散列表的速度将急剧下降。然而,如果使用的散列函数很好,这些链表就不会很长!

性能:

在平均情况下,散列表的查找(获取给定索引处的值)速度与数组一样快,而插入和删除速度与链表一样快,因此它兼具两者的优点!但在最糟情况下,散列表的各种操作的速度都很慢。因此,在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。而要避免冲突,1.填装因子,2.良好的散列函数

1.

填装因子越低,发生冲突的可能性越小,散列表的性能越高。一个不错的经验规则是:一旦填装因子大于0.7,就调整散列表的长度。

2.良好的散列函数让数组中的值呈均匀分布。

糟糕的散列函数让值扎堆,导致大量的冲突。

广度优先搜索

什么是广度优先搜索

解决最短路径问题的算法被称为广度优先搜索

比如,地图2点之间最短距离

image.png 一步探寻后不成功,再尝试探寻第二部。以此往后推,直到成功。 广度优先搜索是一种用于图的查找算法,可帮助回答两类问题。 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径最短?

image.png

第一层搜索结束,开始第二层,开始第三层,和地图上寻找最短距离一样
添加的时候要按着顺序添加,每个朋友就像一个队列(queue),每个朋友连接这朋友的朋友,依此类推,
比如先加A->B->C
查找是就先查找A,而不是B;
队列是一种先进先出的数据结构,二栈是一种后进先出的数据结构。

image.png

在检查中,已经访问过的需要标记,不然就会陷入一下循环 image.png

贪婪算法

image.png 如何找出覆盖全美50个州的最小广播台集合呢?

利用集合的特性来选择

stations={} stations["kone"]=set(["id", "nv", "ut"]) stations["ktwo"]=set(["wa", "id", "mt"]) stations["kthree"]=set(["or", "nv", "ca"]) stations["kfour"]=set(["nv", "ut"]) stations["kfive"]=set(["ca", "az"]) 把每一个州的广播站用set来表示

image.png

最长公共子串

image.png

反向索引

创建一个散列表,这个散列表的键为单词,值为包含指定单词,进行比对,比如key = apple,拥有关键词的有A和B,同时,key= Banana时,拥有关键词的有A和B.这个时候返回A或B给用户,index,常用于创建搜索引擎。从反向索引着手研究是不错的选择。