美文网首页
算法简单理解(三)

算法简单理解(三)

作者: xiaoChannel | 来源:发表于2018-09-03 17:38 被阅读0次

Hash table

Hash table它大概可以说是效能最快的搜索方法。

首先看下Hash table 最基本的定义。
一段Array当成Hash table header,后面接上linked-list,大概是这个样子:


假设我的Hash table size 是N,那就有A[0]-A[N-1]的header。
后面有value 用linked-list接着,所以它的资料量,可能会远比N要大,或比N都要小,都不一定。

那我的value到底要放在哪?

所以,有一个Hash function H(),根据传入的值算出Hash table index,假设要寻找一个value的时候,利用H(value)会算出一个值 --k,然后有了k之后,开始从Hash table A[N]数组的第k行往后找。

从A[k]开始找,一个一个找到一样的,那就OK。找不到一直遇见NULL,那就找不到。

假设Hash function 把一大堆的数据放进来,如果把数值平均分配打散的话,那后面的长度可能3个也可能4个,单基本上差不多,不会说把全部的放在一条中,或者说其中一个有十万个,其他的一个或者几个。那就不是一个hash table了,代表你的hash function做的很差,或者说数据都机会总在前面几行,后面为null,那也说明你的tash function做的很差。

所以说,如果Array够大,Hash function能够平均分配,Linked-list长度是有限制的,大概可能4个或者5个,所以我要找的时候,只要找到k值,从第k条,开始往后找,那我比对个1-5次可能就找到了

那它的Complexity:O(1)

也就是说跟你的N大或者小,是无关的,大概找个几次就可以找到。

Hash table 设计上有几点要注意的:###

1. Hash table size N
N最好不要是2的倍数,10的倍数,因为这样会让所有的数据,可能会全部偏到一边去,hash table 某一边有一堆值,另外一边可能是null,或者个别几个值,容易造成不平均。
所以最好的table能够是质数或者是2^n -1。

2. Hash function H()
function 最好能够吧数据平均的分散,计算也不要太复杂。
比如有许多现成的Hash funcitons,如FNV-1,MD5等等

3.Hash table的变形
参考Linear probing,Quadratic probing,Double hashing.

Hash table它的Complexity:O(1),基本已经到常数了,基本有很难比这个更快的搜索方式了。

那到底在找一个数据的时候,选择什么样的方式呢?

首先要看数据量。

顺序查找(Sequential Search)

小数据量(几十,几百),虽然慢,但是够了。一个for 就好。简单方便。

二叉搜索树(Binary Search)

数据够大,且已经排序好了,上篇也讲到了,数据大道几十亿的时候,搜索也就几十次,那顺序查找Sequential Search可能得很久,虽然写起来有一点点复杂,可能比for复杂,但是也复杂不到哪去。

Hash table

数据量大,杂乱无排序是比较好的选择,不会比Binary Search慢,数量大的时候,甚至可能比较快

Database

数据库,肯定不会陌生,选择它的前择,数据是结构化的,数据量最好不要超过百万,几百万可能还可以,但是数据几千万的时候,可能会撑不住,效能会明显下降。

Search engine

那数据真的达到几千万或者上亿的时候,可以考虑搜索引擎,但是绝大数人对付这么大的数据的几率是比较低的。

根据数据结构和需求可能会运用到其他算法,如最近的一个一聊天的项目,需要敏感字过滤,然后采用了AC多模式匹配算法,可能还会有更多的状况需要运用到不同的算法,比如我们常见的冒泡排序,快速排序等等,但是这里只是用搜索来理解一下算法的基本概念

SP

然后就暂时这样吧,算法的理解我暂时也就仅此而已,理解的不是很深,因为一般项目中很少会接触大数据的处理,毕竟我只是个搞android的,希望点东西,能够帮助你简单的理解算法。

相关文章

  • 算法简单理解(三)

    Hash table Hash table它大概可以说是效能最快的搜索方法。 首先看下Hash table 最基本...

  • 简单排序(选择排序、起泡排序和插入排序)使用详解

    简单排序算法 简单排序算法是一类算法,指那些直观、易理解的排序算法的总和。 到现在为止,我们已经讲了的三种排序算法...

  • 算法简单理解(二)

    Binary search,也可以说是 二元搜索法。它的Complexity:O(lgN) 它的先决条件是,一个 ...

  • 简单理解“哈希算法”

    【本文由赞我(zaneds.com)独家冠名】 计算机密码学对区块链技术来说可谓是重中之重,我们在阅读各种区块链项...

  • 算法简单理解(一)

    前言:对于算法,本人开始其实蛮揪心的,只是知道它的作用和用法,对于算法没有什么深刻的理解,而且感觉算法,哇,好难的...

  • EM算法简单理解

    样本数据中存在隐变量导致无法直接用极大似然估计求解参数的情况. 就是直接求解似然函数L(θ) = P(X,Z|θ)...

  • 排序算法详解

    排序算法是算法理论的基础,可以说只有理解了排序算法,才能更加深入地理解其他更加复杂的算法。简单的排序的算法包括选择...

  • 常见调度算法总结

    先来先服务算法 先来先服务算法是最简单的调度算法(FCFS),也叫先进先出算法(FIFO) 优点:易于理解并且易于...

  • 简单理解Paxos算法(译)

    本文翻译自Quora上的一个回答 我认为在了解Paxos前,可以先谈谈其他解决共识问题的方法,在这个基础上再理解P...

  • Java简单理解排序算法

    今天突然想使用简单的方式,总结一下常见的六种排序算法。我们都知道,这六种排序算法分别是:冒泡排序、选择排序、插入排...

网友评论

      本文标题:算法简单理解(三)

      本文链接:https://www.haomeiwen.com/subject/pnwbwftx.html