百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python – 余数分布|Hash(python中求余数的符号)

off999 2024-10-07 12:10 32 浏览 0 评论

这篇文章主要是在计算LeetCode-706设计哈希映射时,碰到关于计算余数的问题,用seaborn夈表观察一下质数的余数分布情况。

会涉及以下几方面内容:

  1. 质数和余数
  2. Seaborn绘制swarmplot和lineplot
  3. Pandas的pivot_table的计算

在数据处理的一些敏感信息,我用xxxxxx进行了替代,但不影响整理代码阅读

主要参考的相关网站有以下几个:

  • https://seaborn.pydata.org/tutorial/function_overview.html


1. LeetCode题解
#------------------------LeetCode-706|设计哈希映射---------------------------
"""
用一个大质数将key取余,将数据分成不同bucket;
分bucket将[key,value]记入列表;再进行相应操作;
"""
class MyHashMap2:
#用余数进行bucket分类,分别获取hash.table的内容
#用较大质数,将数据平均分布在bucket中
def __init__(self):
  #定义初始化hash.table
  self.prime=1093 #定义一个质数
  self.table=[[] for _ in range(self.prime)] #初始化hash.table

def put(self, key: int, value: int) -> None:
  #分两种情况:1.原key存在,更新值;2.原key不存在,添加值
  bucket=key%self.prime #余数,表示bucket区域
  for item in self.table[bucket]: #key存在
    if item[0]==key:
      item[1]=value
      return #return跳出put功能
     self.table[bucket].append([key,value]) #key不存在,添加值

def get(self, key: int) -> int:
  #1.key存在,返回value;2.key不存在,返回-1
  bucket=key%self.prime #余数,表示bucket区域
  for idx,val in self.table[bucket]: #key存在
    if idx==key:
      return val
  return -1

def remove(self, key: int) -> None:
  bucket=key%self.prime #余数,表示bucket区域
  for idx,item in enumerate(self.table[bucket]): #key存在bucket
    if item[0]==key:
      self.table[bucket].pop(idx)

1. 质数的余数分布

"""
在做LeetCode-706设计哈希映射的时候,在处理余数时;
想观察一下不质数和合数在处理余数时的分布
prime table/质数表 <1000
primes=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
"""
import os
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
path=r'C:\Users\02279074\OneDrive - Elanco\Lilly_OneDrive\C\TZ\Algorithm'
# --------------generate data-----------------------
# prime table/质数表 <100
#primes=[ 3, 13, 23, 43,53] #选取一些质数
primes=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
nums=pd.Series(np.random.randint(1,100,size=500)) #n个随机整数
# nums=pd.Series(np.arange(1,101,step=1)) #生成数列
dfList=[]
for prime in primes:
  df=pd.DataFrame([nums,nums%prime]).T #生成余数表
  df['type']='prime-'+str(prime)
  dfList.append(df)
dfs=pd.concat(dfList) #合并成一个df
dfs.columns=['nums','remain','type']
# -------------generate pivot_table------------------
pvt=pd.pivot_table(dfs,
          index='remain',
          columns='type',
          values='nums',
          aggfunc='count',
          fill_value=0)
output_f=os.path.join(path,'remind_distribution.xlsx')
with pd.ExcelWriter(output_f) as writer:
  dfs.to_excel(writer,sheet_name='table',index=True)
  pvt.to_excel(writer,sheet_name='pvt',index=True)
# ----------------扰动图--------------------------
#fig为画布,ax为子图对象
fig,ax=plt.subplots(figsize=(12,8),dpi=120) #图表布局
ax=sns.swarmplot(data=dfs, #数据
          x="remain",
          y="nums",
          hue="type", #分类
          # jitter=0.25, #抖动幅度
          )
plt.grid(True) #添加网格线
file1=os.path.join(path,'swarmplot.png')
plt.savefig(file1)
plt.close()
# ----------------柱状图--------------------------
#fig为画布,ax为子图对象
fig,ax=plt.subplots(figsize=(12,8),dpi=120) #图表布局
ax=sns.lineplot(data=pvt,
					)
xlabels=[int(x) for x in ax.get_xticks()] #x轴整数
ax.set_xticklabels(xlabels)
plt.grid(True) #添加网格线
file2=os.path.join(path,'lineplot.png')
plt.savefig(file2)
plt.close()
print("all done".center(50,"*"))

生成两个图形:

1.扰动图swarmplot: x轴为余数,y轴为随机数;

2.线形图lineplot: x轴为余数,y轴为余数的计数和;

观察lineplot可以看到,随着prime的值不变增加,每个余数remain的计数和更加趋于平均;就这表示质数越大,分布在余数上的值就更平均。

相关推荐

win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
电脑uac是什么意思

UAC就是用户帐户控制,在对计算机进行更改之前,用户帐户控制(UAC)会通知您。比如安装软件驱动什么的,默认UAC设置会在程序尝试对计算机进行更改时通知您,但您可以通过调整设置来控制UAC...

笔记本找不到自己家的wifi怎么办

1.笔记本电脑缺少无线网卡驱动,需要下载驱动如果笔记本电脑开机之后,无法显示WiFi网络的图标,这个时候多半是因为电脑缺少无线网卡驱动造成的,有时候自己在清理电脑的时候,不小心清理了驱动程序,便会...

电信宽带办理电话是多少(电信宽带办理联系电话)

电信宽带不一定需要电信手机号码,可以根据自身需要选择,有单独的宽带业务,一般要求预存一定时间的使用费。不过一般包含了宽带、手机号码的融合套餐总体上更优惠,对客户来说更划算。如果有相应需求的话,建议同时...

开机进入ghost启动项(电脑启动进入ghost)

电脑启动的时候进入GHOST界面方法:  1、首先确认电脑装了GHOST软件。  2、重启电脑,注意仔细观察电脑屏幕,会有一个3s或者10s的选择界面。让选择是进入GHOST界面,或者正常启动进入系...

华硕bios修复蓝屏图解(华硕bios修复蓝屏视频教程)

先看下BIOS是否可以识别到硬盘设备,若看不到,硬盘故障的可能性很大。若可以看到硬盘,建议先尝试进行BIOS兼容性设置:1,在BIOS界面,通过方向键进【Secure】菜单,通过方向键选择【Sec...

老电脑怎么装win7系统(老电脑装win7系统可以吗)

6年前的电脑,如果是用的当时最新的CPU的话,应该是第7代或者第6代酷睿等级的。运行windows7和windows10都应该没有压力。从软件的兼容性来说,还是建议安装windows10,因为现在有好...

电脑怎么设置到点自动关机(电脑怎样设置到点关机)

1、首先我们点击电脑屏幕左下角的开始按钮,在所有程序里依次选择附件---系统工具,接着打开任务计划程序。2、我们打开任务计划程序后,在最右边的操作框里选择创建基本任务,然后在创建基本任务对话框的名称一...

2025年笔记本电脑排行榜(20201年笔记本电脑推荐)

2023华为笔记本电脑matebook16系列很好用的。因为这个系列她是有非常好的性价,比的是能够让你有非常轻薄的厚度,并且能够有11.6寸的屏幕,而且还有120赫兹的刷新率作为大学生,您可能需要经常...

powerpoint激活密钥(ppt密钥 激活码2010)

1/4进入文件打开一个PPT文件进入到软件界面,在界面左上方找到文件选项,点击该选项进入到文件页面。2/4点击账户文件页面中,页面左侧找到账户选项,点击该选项,页面右侧会出现相应的操作选择。3/4点击...

水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
qq恢复删除好友官网(qq恢复已删好友)
qq恢复删除好友官网(qq恢复已删好友)

qq恢复官方网站,http://huifu.qq.com/1、什么是QQ恢复系统?QQ恢复系统是腾讯公司提供的一项找回QQ联系人、QQ群的服务,向所有QQ用户免费开放。2、QQ恢复系统能恢复多长时间内删除的好友?普通用户可以申请恢复3个月内...

2025-12-28 16:03 off999

优启通u盘重装win7系统教程(优启通u盘装win7系统教程图解)

系统显示未找到万能驱动的解决方法是:1、重插下usb口1、造成“找不到驱动器设备驱动程序”的原因,可能是usb口出现问题。2、换个usb口可能是单独这个usb口出现问题,可以选择另外的usb口重试wi...

笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
wifi加密方式怎么设置(wifi网络加密怎么设置)

若你想将自己的无线网改成加密的,可以按照以下步骤操作:1.打开你的路由器管理界面。一般来说,在浏览器地址栏输入“192.168.1.1”或“192.168.0.1”,然后输入用户名和密码登录就可以打...

取消回复欢迎 发表评论: