1.常见的数据查找算法:

众所周知,顺序查找是最简单的查找方式,但要将所有数据遍历一遍所以效率相对较低,对大数据量的査找问题显然不行。二分查找的查找效率虽然非常高但是数据必须有序,而对数据排序通常需要更多的时间,因此只适用于在排好序的数据中找。而深度优先搜索算法、广度优先搜索算法 ,是一种暴力査找法优化算法,同样对大数据量的查找问题效率也不高。哈希算法也是一种查找算法,可以说哈希算法是最快的查找算法。对于查找问题,哈希算法一直是首选算法。

2.算法原理及特点:

1> 简单来说,就是把一些复杂的数据通过某种函数映射关系映射成更加易于査找的方式。每个数据都会映射为独一无二的地址,数据存储时它会存储于这个地址取数据时还会在这个地址取。哈希算法就像一本字典,当需要査词的时候通过目录找到页码,再到对应页码就能找到所需要的内容了。

用书面语解释就是:根据总体数据量预先设置一个数组,使用一个哈希函数并以数据的关键字作为自变量得到唯一的返回值。这样就可以利用哈希函数将数据元素映射到数组的某位置并把数据存放在对应位置上。在查找时,通过哈希函数计算该数据应该存储在哪里再到相应的存储位置取出查找的数据。

2> 哈希算法的查找速度与数据多少无关,在没有发生”碰撞”或“溢出”的情况下,只需一次读取。同时该算法的保密性特别好,如果事先不知道哈希函数就无法进行查找从而获得数据。(注意:设计一个好的哈希函数是重中之重,好的哈希函数应该使每个关键字都尽可能地散列到每一个位置中去。面对的第一个问题就是如何设计一个易于计算并且均匀分布所有的键的哈希函数。)

2.常见算法:(除法哈希算法、乘法哈希算法、平方取中法、随机数哈希算法等。)

除法哈希算法:用每一个关键字去除以一个特定的质数,所得的余数就是该关键字的哈希值。通过 x 除以 m 的余数将关键字映射到数组的 m 个位置中。

除哈希函数公式为  :                h(x) = x mod m

举个例子,设计一个程序,以除留余数法的哈希算法取得索引值,再用线性探测法来储存数据。(线性探测法是用于处理当数据发生碰撞时,若该索引对应的储存位置已有数据,则会以线性的方式依次往后寻找空的存储位置且此时该方法将存储的位置视为一个环形结构,如果后面的位置被填满而前面还有位置时数据还可以放在前面。但线性探测法也有缺点,相似的键值对经常会汇聚在一起,因此平方探测法(或称为二次探测法)也经常被使用,只不过此处并不讨论。)

import random

INDEXBOX=10 #哈希表最大元素

MAXNUM=7 #最大数据个数

def print_data(data,max_number): #打印数组子程序

print('\t',end='')

for i in range(max_number):

print('[%2d] ' %data[i],end='')

print()

#线性探测法

def create_table(num,index): #建立哈希表子程序

tmp=num%INDEXBOX #哈希函数 = 数据%INDEXBOX

while True:

if index[tmp]==-1: #如果数据对应的位置是空的

index[tmp]=num #则直接存入数据

break

else:

tmp=(tmp+1)%INDEXBOX #否则往后找位置存放

#主程序

index=[None]*INDEXBOX

data=[None]*MAXNUM

print('原始数组值:')

for i in range(MAXNUM): #起始数据值

data[i]=random.randint(1,20)

for i in range(INDEXBOX): #清除哈希表

index[i]=-1

print_data(data,MAXNUM) #打印起始数据

print('哈希表的内容:')

for i in range(MAXNUM): #建立哈希表

create_table(data[i],index)

print(' %2d =>' %data[i],end='') #打印单个元素的哈希表位置

print_data(index,INDEXBOX)

print('完成的哈希表:')

print_data(index,INDEXBOX) #打印最后完成的结果

结果:

乘法哈希算法:对给定的长度为 m 的数组,用关键字 x 乘以一个常数 N, N 的值为大于0 并小于 1 的一个小数,并提取出 Nx 的小数部分。之后,用 m 乘以这个小数,再向下取整哈希函数公式为:           h(x) = ⌊m(Nx mod 1)⌋

(⌊,⌋,表示向下取整,其中 Nx mod 1 的意思就是 x 的小数部分。相对于除法哈希算法,乘法哈希算法对于数组的长度 m 没有过多的要求。研究表明N 的值为 0.618 较好。)

例:关键字 8 需要存储,哈希函数为 h(x) = ⌊10 × (0.618x mod 1)⌋,

计算过程如下:h(8) = ⌊10 × (0.618 × 8 mod 1)⌋ = ⌊10 × (4.944 mod 1)⌋ = ⌊10 × 0.944⌋ = ⌊9.44⌋ = 9

那么利用哈希函数存储的数据如图所示,注意数组下标从 0 开始。

平方取中法:首先计算出关键字的平方值,然后取平方值中间几位作为哈希地址。哈希函数公式为:

h(x) = mid(x · x,n)      (其中 mid 的意思就是选取中间 n 位的函数。)

例:关键字的集合为 [123,234,245], 它们对应的平方值为[15129,54756,60025],如果我们选择平方值的千位和百位作为哈希值,则它们的哈希值为 [51,47,0]。

例如,关键字 245 需要存储,哈希函数为 h(x) = mid(x·x,2),计算过程如下:

h(245) = mid(245 × 245,2) = mid(60025,2) = 0

那么利用哈希函数存储的数据如图所示,注意数组下标从 0 开始。

哈希算法python_哈希算法(Python代码实现)相关推荐

  1. 维特比算法 python_维特比算法理解与实现(Python)

    前言 写这篇文章就是想以通俗易懂的方式解析维特比算法,最后给出Python代码的实现.下面的公式和原理均出自<统计学习方法>. 算法的原理 算法的原理1.PNG 算法的原理2.PNG 上面 ...

  2. 【负荷预测】基于灰色预测算法的负荷预测(Python代码实现)

    目录 1 概述 2 流程图 3 入门算例  4 基于灰色预测算法的负荷预测(Python代码实现) 1 概述 "由于数据列的离散性,信息时区内将出现空集(不包含信息的定时区),因此只能按近似 ...

  3. 联邦学习算法介绍-FedAvg详细案例-Python代码获取

    联邦学习算法介绍-FedAvg详细案例-Python代码获取 一.联邦学习系统框架 二.联邦平均算法(FedAvg) 三.联邦随梯度下降算法 (FedSGD) 四.差分隐私随联邦梯度下降算法 (DP- ...

  4. 蚂蚁算法python_蚁群算法python编程实现

    前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...

  5. 自动寻路算法python_关于Dijkstra算法和其他的一些图算法(Johnson, Floyd-Warshall, A*)解决最短路径问题的方法的Python实现。...

    这篇文章其实主要想说的是如何解决最短路径的问题. 其实最短路径问题,我们在生活中都在不知不觉的使用.比如我们在上网的时候,互联网传输采用了各种各样的数据包路由方法.这些路由算法都在幕后工作. 还有一些 ...

  6. 人工鱼群算法python_蚁群算法、免疫优化算法、鱼群算法 Python 库

    github地址guofei9987/scikit-opt​github.com 安装 $pip install scikit-opt 蚁群算法(ACA, Ant Colony Algorithm) ...

  7. pythonsort函数时间复杂度_合并排序算法——时间复杂度详解和python代码实现

    递归形式 递归形式是算法中常用到的一种构造思路.递归允许函数或过程对自身进行调用,是对算法中重复过程的高度概括,从本质层面进行刻画,避免算法书写中过多的嵌套循环和分支语法.因此,是对算法结构很大的简化 ...

  8. 逻辑回归算法python_逻辑回归算法原理和例子

    本课程讲解现在工业界和学术界流行的机器学习算法的相关知识,以及如何用python去实现这些算法.算法的讲解包括supervised learning(有监督式学习)和unsupervised lear ...

  9. 【强化学习】Sarsa算法求解悬崖行走问题 + Python代码实战

    文章目录 一.Sarsa算法简介 1.1 更新公式 1.2 预测策略 1.3 详细资料 二.Python代码实战 2.1 运行前配置 2.2 主要代码 2.3 运行结果展示 2.4 关于可视化寻路过程 ...

最新文章

  1. C++中的RAII机制
  2. html中常见的小问题(1)
  3. JS数组的需要注意的问题
  4. UVALive 6885 Flowery Trails 最短路枚举
  5. 命名空间跟作用域是什么关系_魏如萱许光汉首次合唱新歌《什么跟什么有什么关系》_娱乐频道...
  6. 微信公开课讲师王泓渊:小游戏开放能力
  7. c# 如何读取和写入ini(配置文件)
  8. bzoj-4816,P3704 [SDOI2017]数字表格
  9. ubuntu php开发工具
  10. “相濡以沫,不如相忘于江湖”
  11. ESP8266_遥控小车网页版
  12. [Eclips 安装] eclipse启动不了,出现“Java was...”如何解决
  13. vue中小写数字转换为大写数字
  14. 【功能测试】part2
  15. linux下的buff/cache内存占用过高-手动清除释放内存
  16. web开源框架大汇总
  17. zabbix客户端安装及配置
  18. 计算机专业学生给家长的一封信,大学致家长的一封信
  19. spss入门——简单的数据预处理到时间序列分析系列(二)
  20. jQurey回车登陆

热门文章

  1. SAP PP常用表(重要)
  2. 据说是Jack Wu的自定义函数!烂
  3. excel取整函数_Excel中的这些烧脑问题,你遇到过几种?
  4. 中科院的matlab课件,中科院的matlab课件
  5. java课程设计 成绩_java课程设计 学生成绩管理
  6. vc 运行c语言步骤,第1章_C语言概述(vc++环境如何运行c语言程序)[精选].ppt
  7. php 不存在给默认值,当属性不存在时,创建一个属性并给它一个默认值
  8. Python中包含义及其定义
  9. python3 拼接字符串的7种方法
  10. Python:函数变量的使用