Library

import pandas as pd
import numpy as np
import time

读取数据

df = pd.read_excel('重庆市印刷和记录媒介复制业754.xlsx')
df.dropna(axis=0, how='any')  # 去除非数
print("表长为:", len(df))
df.head()
表长为: 754
ID 企业名称 电话 企业地址
0 0 万州区永佳路万德印刷厂 15178905742 重庆市万州区双河口永佳路325号
1 1 覃彩虹 13594410133 重庆市万州区熊家镇古城大道296号
2 2 重庆优得利印刷有限公司 023-65903102 重庆市江津区双福工业园1幢1号
3 3 重庆市开州区森美印刷有限公司 15608330060 重庆市开州区云枫街道平桥社区桔乡路369号门市
4 4 吕兴华 13896015224 重庆市璧山区大路街道天星街23号

get_nums

def get_nums(s):'''逐位相加其ASCII码'''s = str(s)nums = 0for s0 in s:if(s0 == '-'):continuetry:nums += ord(s0)except:print("error: ",s)return nums
get_nums("重庆优得利印刷有限公司")
276879

平方取中法

df['nums_电话'] = df['电话'].apply(get_nums)
df['nums_电话^2'] = df['nums_电话'].apply(lambda x: np.square(x))
df['nums_企业名称'] = df['企业名称'].apply(get_nums)
# df['nums_电话^4'] = df['nums_电话^2'].apply(lambda x: np.square(x))
df.head()
ID 企业名称 电话 企业地址 nums_电话 nums_电话^2 nums_企业名称
0 0 万州区永佳路万德印刷厂 15178905742 重庆市万州区双河口永佳路325号 577 332929 257952
1 1 覃彩虹 13594410133 重庆市万州区熊家镇古城大道296号 562 315844 94053
2 2 重庆优得利印刷有限公司 023-65903102 重庆市江津区双福工业园1幢1号 559 312481 276879
3 3 重庆市开州区森美印刷有限公司 15608330060 重庆市开州区云枫街道平桥社区桔乡路369号门市 560 313600 364365
4 4 吕兴华 13896015224 重庆市璧山区大路街道天星街23号 569 323761 63703
def get_mid(x):'''取中间三位数作为地址'''return int(x/10)%1000
df['adr_电话'] = df['nums_电话^2'].apply(get_mid)
df['adr_企业名称'] = df['nums_企业名称'].apply(get_mid)
df.head(100)
ID 企业名称 电话 企业地址 nums_电话 nums_电话^2 nums_企业名称 adr_电话 adr_企业名称
0 0 万州区永佳路万德印刷厂 15178905742 重庆市万州区双河口永佳路325号 577 332929 257952 292 795
1 1 覃彩虹 13594410133 重庆市万州区熊家镇古城大道296号 562 315844 94053 584 405
2 2 重庆优得利印刷有限公司 023-65903102 重庆市江津区双福工业园1幢1号 559 312481 276879 248 687
3 3 重庆市开州区森美印刷有限公司 15608330060 重庆市开州区云枫街道平桥社区桔乡路369号门市 560 313600 364365 360 436
4 4 吕兴华 13896015224 重庆市璧山区大路街道天星街23号 569 323761 63703 376 370
... ... ... ... ... ... ... ... ... ...
95 95 重庆涵天包装印务有限公司 023-72231721 重庆市涪陵区太极大道34号负一楼 558 311364 318409 136 840
96 96 垫江县金辉印刷厂 13110182246 重庆市垫江县周嘉镇迎春路 557 310249 209484 24 948
97 97 重庆凯翔包装印务有限公司 13709401186 重庆市永川区大安街道办事处大安工业园区 568 322624 321198 262 119
98 98 丰都县蓝图印务有限公司 15803661811 重庆市丰都县三合街道商业二路117号附2号 568 322624 284565 262 456
99 99 重庆毅然包装印刷有限公司 13509402066 重庆市綦江区文龙街道大田湾6号 564 318096 323964 809 396

100 rows × 9 columns

除留余数法

df['adr_电话_1'] = df['nums_电话^2']%1007
df['adr_企业名称_1'] = df['nums_企业名称']%1007
df.head()
ID 企业名称 电话 企业地址 nums_电话 nums_电话^2 nums_企业名称 adr_电话 adr_企业名称 adr_电话_1 adr_企业名称_1
0 0 万州区永佳路万德印刷厂 15178905742 重庆市万州区双河口永佳路325号 577 332929 257952 292 795 619 160
1 1 覃彩虹 13594410133 重庆市万州区熊家镇古城大道296号 562 315844 94053 584 405 653 402
2 2 重庆优得利印刷有限公司 023-65903102 重庆市江津区双福工业园1幢1号 559 312481 276879 248 687 311 961
3 3 重庆市开州区森美印刷有限公司 15608330060 重庆市开州区云枫街道平桥社区桔乡路369号门市 560 313600 364365 360 436 423 838
4 4 吕兴华 13896015224 重庆市璧山区大路街道天星街23号 569 323761 63703 376 370 514 262

创建哈希表(分别使用开发地址与公共溢出区解决冲突)

#初始化为全0# 开放地址法所使用的hash
hash_map_tele = np.zeros(32000)
hash_map_name = np.zeros(8000)# 公共溢出区所使用的hash
hash_map_tele_1 = np.zeros(2100)
hash_map_name_1 = np.zeros(2100)len(hash_map_tele)
400000
#探测开放地址法
def create_hash_map_tele(x, adr, df_ID):try:adr = int(x[adr])except:print('error: ', adr)while(hash_map_tele[adr] != 0):adr += 800hash_map_tele[adr] = x[df_ID]def create_hash_map_name(x, adr, df_ID):try:adr = int(x[adr])except:print('error: ', adr)while(hash_map_name[adr] != 0):adr += 800hash_map_name[adr] = x[df_ID]#使用公共溢出区
count1 = 0
count2 = 0
def create_hash_map_tele1(x, adr, df_ID):global count1if(hash_map_tele_1[x[adr]] == 0):hash_map_tele_1[x[adr]] = x[df_ID]else:hash_map_tele_1[1100 + count1] = x[df_ID]count1 += 1def create_hash_map_name1(x, adr, df_ID):global count2if(hash_map_name_1[x[adr]] == 0):hash_map_name_1[x[adr]] = x[df_ID]else:hash_map_name_1[1100 + count2] = x[df_ID]count2 += 1
df.apply(create_hash_map_tele, axis=1, args=('adr_电话', 'ID'))
df.apply(create_hash_map_name, axis=1, args=('adr_企业名称', 'ID'))df.apply(create_hash_map_tele1, axis=1, args=('adr_电话_1', 'ID'))
df.apply(create_hash_map_name1, axis=1, args=('adr_企业名称_1', 'ID'))hash_map_tele
array([0., 0., 0., ..., 0., 0., 0.])

查找流程(平方取中+开发地址探测法)-method1

# 查找
search_method = int(input("请输入你查找关键词的类型:1,电话查找;2,企业名称查找"))
if(search_method == 1):tele = input("请输入你要查找对象的电话号码:")tele = int(tele)time_start = time.time()nums = get_mid(pow(get_nums(tele), 2))print("-----base_nums-----\n",nums)print("-----hash_map_tele_value-----\n", hash_map_tele[nums])print("-----开始查找-----")while(df['电话'][hash_map_tele[nums]] != tele):# print("-----tele-----\n", df['电话'][hash_map_tele[nums]])nums += 800# print('-----add_nums-----\n', nums)if(nums >= 32000):print('查找错误:无该信息')breaktime_end = time.time()if(nums < 32000):print("---------------你查找的信息如下:---------------\n", df.loc[hash_map_tele[nums]])print("---------------本次查找耗时:---------------\n",time_end-time_start)
elif(search_method == 2):name = input("请输入你要查找对象的企业名称:")time_start = time.time()nums = get_mid(get_nums(name))print("-----base_nums-----\n",nums)print("-----hash_map_tele_value-----\n", hash_map_name[nums])print("-----开始查找-----")while(df['企业名称'][hash_map_name[nums]] != name):# print("-----tele-----\n", df['企业名称'][hash_map_name[nums]])nums += 800# print('-----add_nums-----\n', nums)if(nums >= 8000):print('查找错误:无该信息')breaktime_end = time.time()if(nums < 8000):print("---------------你查找的信息如下:---------------\n", df.loc[hash_map_name[nums]])print("---------------本次查找耗时:---------------\n",time_end-time_start)
else:print("请选择正确的查找方式!")
-----base_nums-----370
-----hash_map_tele_value-----4.0
-----开始查找-----
---------------你查找的信息如下:---------------ID                          4
企业名称                      吕兴华
电话                13896015224
企业地址         重庆市璧山区大路街道天星街23号
nums_电话                   569
nums_电话^2              323761
adr_电话                    376
nums_企业名称               63703
adr_企业名称                  370
Name: 4, dtype: object
---------------查找耗时:---------------0.0009999275207519531

查找流程(除留余数法+公共溢出法)-method2

# 查找
search_method = int(input("请输入你查找关键词的类型:1,电话查找;2,企业名称查找"))
if(search_method == 1):tele = input("请输入你要查找对象的电话号码:")tele = int(tele)time_start = time.time()nums = get_nums(tele)%1007print("-----base_nums-----\n",nums)print("-----hash_map_tele_value-----\n", hash_map_tele_1[nums])print("-----开始查找-----")while(df['电话'][hash_map_tele_1[nums]] != tele):# print("-----tele-----\n", df['电话'][hash_map_tele_1[nums]])nums += 1# print('-----add_nums-----\n', nums)if(nums >= 2100):print('查找错误:无该信息')breaktime_end = time.time()if(nums < 2100):print("---------------你查找的信息如下:---------------\n", df.loc[hash_map_tele_1[nums]])print("---------------本次查找耗时:---------------\n",time_end-time_start)
elif(search_method == 2):name = input("请输入你要查找对象的企业名称:")time_start = time.time()nums = get_nums(name)%1007print("-----base_nums-----\n",nums)print("-----hash_map_tele_value-----\n", hash_map_name_1[nums])print("-----开始查找-----")while(df['企业名称'][hash_map_name_1[nums]] != name):# print("-----tele-----\n", df['企业名称'][hash_map_name_1[nums]])nums += 1# print('-----add_nums-----\n', nums)if(nums >= 2100):print('查找错误:无该信息')breaktime_end = time.time()if(nums < 2100):print("---------------你查找的信息如下:---------------\n", df.loc[hash_map_name_1[nums]])print("---------------本次查找耗时:---------------\n",time_end-time_start)
else:print("请选择正确的查找方式!")
-----base_nums-----262
-----hash_map_tele_value-----4.0
-----开始查找-----
---------------你查找的信息如下:---------------ID                           4
企业名称                       吕兴华
电话                 13896015224
企业地址          重庆市璧山区大路街道天星街23号
nums_电话                    569
nums_电话^2               323761
nums_企业名称                63703
adr_电话                     376
adr_企业名称                   370
adr_电话_1                   514
adr_企业名称_1                 262
Name: 4, dtype: object
---------------本次查找耗时:---------------0.005001544952392578

性能分析

df.head(10)
ID 企业名称 电话 企业地址 nums_电话 nums_电话^2 nums_企业名称 adr_电话 adr_企业名称 adr_电话_1 adr_企业名称_1
0 0 万州区永佳路万德印刷厂 15178905742 重庆市万州区双河口永佳路325号 577 332929 257952 292 795 619 160
1 1 覃彩虹 13594410133 重庆市万州区熊家镇古城大道296号 562 315844 94053 584 405 653 402
2 2 重庆优得利印刷有限公司 023-65903102 重庆市江津区双福工业园1幢1号 559 312481 276879 248 687 311 961
3 3 重庆市开州区森美印刷有限公司 15608330060 重庆市开州区云枫街道平桥社区桔乡路369号门市 560 313600 364365 360 436 423 838
4 4 吕兴华 13896015224 重庆市璧山区大路街道天星街23号 569 323761 63703 376 370 514 262
5 5 重庆海渝包装印刷有限公司 13883451070 重庆市璧山区奥康工业园金剑路271号 568 322624 323605 262 360 384 358
6 6 重庆鼎鸿印务有限公司 17782279989 重庆市永川区来龙四路36号 597 356409 292462 640 246 938 432
7 7 重庆奔速彩印有限公司 023-62802235 重庆市九龙坡区歇台子渝州路100号附1-5-1号 561 314721 274268 472 426 537 364
8 8 重庆市永川区木森印刷有限公司 18580704257 重庆市永川区三教镇三川路216号 575 330625 361502 62 150 329 996
9 9 重庆梧桐树印务有限公司 023-67980980 重庆市渝中区张家花园街206号 580 336400 291369 640 136 62 346
print("表长为:", len(df))
表长为: 754

32000与8000的来历

print("重复元素最多次数fen'bie为:")
for i in range(500):flag = 0for j in range(800):index = 800*i + jif(hash_map_tele[index] != 0):flag = 1if(flag == 0):print("tele_i:", i)breakfor i in range(500):flag = 0for j in range(800):index = 800*i + jif(hash_map_name[index] != 0):flag = 1if(flag == 0):print("name_i:", i)break
tele_i: 39
name_i: 9

计算method1的ASL

c1 = 0  # 统计总的查找次数
for i in range(500):for j in range(800):index = 800*i + jif(hash_map_tele[index] != 0):c1 += (i+1)
print('method1-tele-asl:', c1/754)
c2 = 0  # 统计总的查找次数
for i in range(500):for j in range(800):index = 800*i + jif(hash_map_name[index] != 0):c2 += (i+1)
print('method1-name-asl:', c2/754)
method1-tele-asl: 12.10079575596817
method1-name-asl: 1.6498673740053051

计算method2的ASL

df1 = df.adr_电话_1.value_counts()
print(df1)
514    39
916    33
329    32
47     31
767    31
187    29
216    29
473    28
619    27
646    26
384    26
62     26
9      25
372    25
175    21
530    20
6      20
852    19
256    18
130    18
780    17
690    17
343    16
917    16
653    15
537    15
685    13
423    12
513    11
891    11
201    10
771    10
311     9
859     7
994     7
93      6
386     5
568     5
938     5
206     4
28      4
688     3
890     3
788     2
119     2
590     1
309     1
752     1
494     1
894     1
434     1
Name: adr_电话_1, dtype: int64
df2 = df.adr_企业名称_1.value_counts()
print(df2)
68      6
90      5
406     5
231     4
979     4..
439     1
768     1
445     1
446     1
1006    1
Name: adr_企业名称_1, Length: 516, dtype: int64
print("有多少个元素在method2-tele基础表中,即只需查一次:",len(df1))
print("有多少个元素在method2-name基础表中,即只需查一次:",len(df2))
有多少个元素在method2-tele基础表中,即只需查一次: 51
有多少个元素在method2-name基础表中,即只需查一次: 516
# 基本表中的元素只需查一次,溢出区的元素和顺序表的查找次数是一样的,所以可以使用等差数列的计算公式进行计算,不过需要注意的就是溢出区的查找次数是从2开始的
print("method2-tele-asl:", (51 + (703*2 + (703*702)/2))/754)
print("method2-name-asl:", (516 + (238*2 + (238*237)/2))/754)
method2-tele-asl: 329.19098143236073
method2-name-asl: 38.720159151193634

最终得出结果

  • method1-tele-asl: 12.10079575596817
  • method1-name-asl: 1.6498673740053051
  • method2-tele-asl: 329.19098143236073
  • method2-name-asl: 38.720159151193634

分析

总的来说,重复元素的个数越多,哈希查找的效率就相应越低

而法1的开放地址探测法对冲突的解决在本题中查找效率是明显优于公共溢出法的,但相应的占据了更大的存储空间

至于平方去中法以及除留余数法在本题中映射出来的地址重复个数基本一致,故不相上下

使用散列表进行查找【查找关键词:电话号码,名称】【平方取中法,除留余数法】【开放地址探测法,公共溢出区法】【计算ASL】相关推荐

  1. 设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...

    第一章 需求分析 1.1 问题描述 设计一个电话号码查询系统,为来访的客⼈提供各种信息查询服务. 1.2 基本要求 设计每个记录有下列数据项:电话号码.用户名.地址 从键盘输入个记录,分别以电话号码和 ...

  2. 数据结构课设(散列表的设计与实现---电话号码查找系统)

    一.要求: [问题描述] 设计散列表实现电话号码查找系统. [基本要求] 1) 设每个记录有下列数据项:电话号码.用户名.地址:2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表:3)  ...

  3. 用链接法实现散列表构造和查找

    在学习数据结构课程时,老师布置的一次录屏作业,以下内容是本次学习中的思路过程. 文章目录 题目描述 草稿记录->发现问题 解决问题 编写代码 总结 题目描述 [问题描述] 设哈希(Hash)表的 ...

  4. 散列表的平均查找长度

    等概率情况下查找成功平均查找长度 等概率情况下查找不成功的平均查找长度 题目要求 将关键字序列(7.8.30.11.18.9.14)散列存储到散列表中.散列表的存储空间是一个下标从0开始的一维数组,散 ...

  5. 查找 之 散列表查找(哈希表)

    基础概念 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).这里对应关系f称为散列函数,又称为哈希(Hash)函数. 采用散列技术将 ...

  6. 数据结构课程设计-利用散列表做一个电话号码查找系统

    [基本要求] (1)设每个记录有下列数据项:电话号码.用户名.地址: (2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表: (3)采用一定的方法解决冲突: (4)查找并显示给定电话号码的 ...

  7. 009.查找手机电话簿【散列表】

    1. 散列表 顺序存储的结构类型需要一个一个地按顺序访问元素,当总量很大且我们所要访问的元素比较靠后时,顺序存储的结构类型性能就比较低.而散列表是一种空间换时间的存储结构,也是提升效率的一种比较常用的 ...

  8. 《数据结构与算法》(二十)- 散列表查找

    目录 前言 1. 散列表查找(哈希表)概述 1.1 散列表查找定义 1.2 散列表查找步骤 2. 散列函数的构造方法 2.1 直接定址法 2.2 数字分析法 2.3 平方取中法 2.4 折叠法 2.5 ...

  9. 散列表查找(哈希表)

    散列函数构造经常要考虑: 1.散列表的长度 2.关键字的长度 3.关键字的分布情况 4.计算散列函数所需的时间 5.记录的查找频率 一个"好"的散列函数应遵循一下两条原则 (1)函 ...

最新文章

  1. obs多推流地址_抖音obs推流直播怎么操作,抖音直播推流地址如何获取?
  2. PHP的替换strstr strtr str_replace substr_replace
  3. 面试题 锁消除是什么
  4. 用c语言写出一个榜单程序,C语言依然位居榜单前列,依然值得程序员学习
  5. dropbox_Dropbox的5种开源替代品
  6. ROS笔记(17) Gazebo
  7. SpringBoot学习笔记(2) Spring Boot的一些配置
  8. redis中value大小_查看redis的Value值大小
  9. POJ1769(线段树+DP)
  10. oracle建表时添加comment,MYSQL中创建表时可以直接声明comment,ORACLE中似乎不可以,那么oracle该怎样简明地声明comment...
  11. [Linux笔记]重装windows后重装grub
  12. 数据-第18课-栈与递归
  13. Linux驱动模块Makefile编写
  14. Wap模拟器,pc端浏览器,手机wap网站,web项目
  15. 太漂亮了!有了3款开源图标库,不用再去求设计师了
  16. 思腾合力-SCM集群下载镜像步骤
  17. unison+inotify数据实时双向同步
  18. 他一生仅凭252个字,就傲视千古…
  19. 野火FPGA征途Pro学习笔记(IP核)
  20. 冒泡排序动态示意【Scratch】

热门文章

  1. 龙套生涯:《龙虎会风云》——袁日初
  2. 消息服务器更新库存,数据中心降温 2019年服务器存储器进入库存调整
  3. Axure中继器的使用-更新数据(四)
  4. git ---版本管理
  5. 低功耗蓝牙开发必备工具指南
  6. html调整表格位置上下左右,利用jquery实现在html的表格中使用上下左右键切换单元格,同时只限制单元格输入数字...
  7. ambari配置ranger
  8. 心电图多少为正常范围_【心电图参数及正常范围】_指标_正常值-大众养生网
  9. 查看 / 修改本地 Git 用户名和邮箱地址
  10. Spark-Streaming连接kafka0.8 能连接却不能消费问题