Python 哈希表的实现——字典

Python | 六、哈希表 Hash Table(列表、集合、映射)、可迭代对象 哈希表基础、常见的三种哈希表结构(列表、集合、映射)、可迭代对象 阅读详情

接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧

虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构

在 Python 中,字典的键(key)被哈希,哈希值决定了键对应的值(value)在字典底层数据存储中的位置

那么今天我们就来看看哈希表的原理以及如何实现一个简易版的 Python 哈希表

ps:文中提到的 Python 指的是 CPyhton 实现

何为哈希表?

哈希表(hash table)通常是基于“键-值对”存储数据的数据结构

哈希表的键(key)通过哈希函数转换为哈希值(hash value),这个哈希值决定了数据在数组中的位置。这种设计使得数据检索变得非常快

举个例子,下面有一组键值对数据,其中歌手姓名是 key,歌名是 value

+------------------------------+
|   Key        |   Value       |
+------------------------------+
| Kanye        | Come to life  |
| XXXtentacion | Moonlight     |
| J.cole       | All My Life   |
| Lil wanye    | Mona Lisa     |
| Juice WRLD   | Come & Go     |
+------------------------------+

如果我们想要将这些键值对存储在哈希表中,首先需要将键的值转换成哈希表的数组的索引,这时候就需要用到哈希函数了

哈希函数是哈希表实现的主要关键,它能够处理键然后返回存放数据的哈希表中对应的索引

一个好的哈希函数能够在数组中均匀地分布键,尽量避免哈希冲突(两个键返回了相同的索引)

image-20231124102113576.png

哈希函数是如何处理键的,这里我们创建一个简易的哈希函数来模拟一下(实际上哈希函数要比这复杂得多)

def simple_hash(key, size):
    return ord(key[0]) % size

这个简易版哈希函数将歌手名(即 key)首字母的 ASCII 值与哈希表大小取余,得出来的值就是歌名(value)在哈希表中的索引

那这个简易版哈希函数有什么问题呢?聪明的你一眼就看出来了:容易出现碰撞。因为不同的键的首字母有可能是一样的,就意味着返回的索引也是一样的

例如我们假设哈希表的大小为 10 ,我们以上面的歌手名作为键然后执行 simple_hash(key, 10) 得到索引

image-20231124111316696.png

可以看到,由于Juice WRLD 和 J.cole 的首字母都一样,哈希函数返回了相同的索引,这里就发生了哈希碰撞

虽然几乎不可能完全避免任何大量数据的碰撞,但一个好的哈希函数加上一个适当大小的哈希表将减少碰撞的机会

当出现哈希碰撞时,可以使用不同的方法(例如开放寻址法)来解决碰撞

应该设计健壮的哈希函数来尽量避免哈希碰撞

我们再来看其他的键,Kanye 通过 simple_hash() 函数返回 index 5,这意味着我们可以在索引 5 (哈希表的第六个元素)上找到 其键 Kanye 和值Come to life

image-20231124140016486.png

哈希表优点

在哈希表中,是根据哈希值(即索引)来寻找数据,所以可以快速定位到数据在哈希表中的位置,使得检索、插入和删除操作具有常数时间复杂度 O(1) 的性能

与其他数据结构相比,哈希表因其效率而脱颖而出

不但如此,哈希表可以存储不同类型的键值对,还可以动态调整自身大小

Python 中的哈希表实现

在 Python 中有一个内置的数据结构,它实现了哈希表的功能,称为字典

Python 字典(dictionary,dict)是一种无序的、可变的集合(collections),它的元素以 “键值对(key-value)”的形式存储

字典中的 key 是唯一且不可变的,这意味着它们一旦设置就无法更改

my_dict = {"Kanye": "Come to life", "XXXtentacion": "Moonlight", "J.cole": "All My Life"}

在底层,Python 的字典以哈希表的形式运行,当我们创建字典并添加键值对时,Python 会将哈希函数作用于键,从而生成哈希值,接着哈希值决定对应的值将存储在内存的哪个位置中

所以当你想要检索值时,Python 就会对键进行哈希,从而快速引导 Python 找到值的存储位置,而无需考虑字典的大小

my_dict = {}
my_dict["Kanye"] = "Come to life" # 哈希函数决定了 Come to life" 在内存中的位置
print(my_dict["Alice"]) # "Come to life" 

可以看到,我们通过方括号[key]来访问键对应的值,如果键不存在,则会报错

print(my_dict["Kanye"])  # "Come to life" 
​
# Raises KeyError: "Drake"
print(my_dict["Drake"])

为了避免该报错,我们可以使用字典内置的 get() 方法,如果键不存在则返回默认值

print(my_dict.get('Drake', "Unknown")) # Unknown

在 python 中实现哈希表

首先我们定义一个 HashTable 类,表示一个哈希表数据结构

class HashTable:
    def __init__(self, size):
        self.size = size
        self.table = [None]*size
​
    def _hash(self, key):
        return ord(key[0]) % self.size

在构造函数 __init__() 中:

  • size 表示哈希表的大小
  • table是一个长度为 size 的数组,被用作哈希表的存储结构。初始化时,数组的所有元素都被设为 None,表示哈希表初始时不含任何数据

在内部函数 _hash() 中,用于计算给定 key 的哈希值。它采用给定键 key 的第一个字符的 ASCII 值,并使用取余运算 % 将其映射到哈希表的索引范围内,以便确定键在哈希表中的存储位置。

然后我们接着在 HashTable 类中添加对键值对的增删查方法

class HashTable:
    def __init__(self, size):
        self.size = size
        self.table = [None]*size
​
    def _hash(self, key):
        return ord(key[0]) % self.size
​
    def set(self, key, value):
        hash_index = self._hash(key)
        self.table[hash_index] = (key, value)
​
    def get(self, key):
        hash_index = self._hash(key)
        if self.table[hash_index] is not None:
            return self.table[hash_index][1]
​
        raise KeyError(f'Key {key} not found')
​
    def remove(self, key):
        hash_index = self._hash(key)
        if self.table[hash_index] is not None:
            self.table[hash_index] = None
        else:
            raise KeyError(f'Key {key} not found')

其中,set() 方法将键值对添加到表中,而 get() 该方法则通过其键检索值。该 remove() 方法从哈希表中删除键值对

现在,我们可以创建一个哈希表并使用它来存储和检索数据:

# 创建哈希表
hash_table = HashTable(10)
​
# 添加键值对
hash_table.set('Kanye', 'Come to life')
hash_table.set('XXXtentacion', 'Moonlight')
​
# 获取值
print(hash_table.get('XXXtentacion'))  # Outputs: 'Moonlight'
​
# 删除键值对
hash_table.remove('XXXtentacion')
​
# 报错: KeyError: 'Key XXXtentacion not found'
print(hash_table.get('XXXtentacion'))

前面我们提到过,哈希碰撞是使用哈希表时不可避免的一部分,既然 Python 字典是哈希表的实现,所以也需要相应的方法来处理哈希碰撞

在 Python 的哈希表实现中,为了避免哈希冲突,通常会使用开放寻址法的变体之一,称为“线性探测”(Linear Probing)

当在字典中发生哈希冲突时,Python 会使用线性探测,即从哈希冲突的位置开始,依次往后查找下一个可用的插槽(空槽),直到找到一个空的插槽来存储要插入的键值对。

这种方法简单直接,可以减少哈希冲突的次数。但是,它可能会导致“聚集”(Clustering)问题,即一旦哈希表中形成了一片连续的已被占用的位置,新元素可能会被迫放入这片区域,导致哈希表性能下降

为了缓解聚集问题,假若当哈希表中存放的键值对超过哈希表长度的三分之二时(即装载率超过66%时),哈希表会自动扩容

最后总结一下:

  • 在哈希表中,是根据哈希值(即索引)来寻找数据,所以可以快速定位到数据在哈希表中的位置
  • Python 的字典以哈希表的形式运行,当我们创建字典并添加键值对时,Python 会将哈希函数作用于键,从而生成哈希值,接着哈希值决定对应的值将存储在内存的哪个位置中
  • Python 通常会使用线性探测法来解决哈希冲突问题
    .markdown-body pre,.markdown-body pre>code.hljs{color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}

哈喽大家好,我是咸鱼

接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧

虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构

在 Python 中,字典的键(key)被哈希,哈希值决定了键对应的值(value)在字典底层数据存储中的位置

那么今天我们就来看看哈希表的原理以及如何实现一个简易版的 Python 哈希表

ps:文中提到的 Python 指的是 CPyhton 实现

何为哈希表?

哈希表(hash table)通常是基于“键-值对”存储数据的数据结构

哈希表的键(key)通过哈希函数转换为哈希值(hash value),这个哈希值决定了数据在数组中的位置。这种设计使得数据检索变得非常快

举个例子,下面有一组键值对数据,其中歌手姓名是 key,歌名是 value

+------------------------------+
|   Key        |   Value       |
+------------------------------+
| Kanye        | Come to life  |
| XXXtentacion | Moonlight     |
| J.cole       | All My Life   |
| Lil wanye    | Mona Lisa     |
| Juice WRLD   | Come & Go     |
+------------------------------+

如果我们想要将这些键值对存储在哈希表中,首先需要将键的值转换成哈希表的数组的索引,这时候就需要用到哈希函数了

哈希函数是哈希表实现的主要关键,它能够处理键然后返回存放数据的哈希表中对应的索引

一个好的哈希函数能够在数组中均匀地分布键,尽量避免哈希冲突(两个键返回了相同的索引)

image-20231124102113576.png

哈希函数是如何处理键的,这里我们创建一个简易的哈希函数来模拟一下(实际上哈希函数要比这复杂得多)

def simple_hash(key, size):
    return ord(key[0]) % size

这个简易版哈希函数将歌手名(即 key)首字母的 ASCII 值与哈希表大小取余,得出来的值就是歌名(value)在哈希表中的索引

那这个简易版哈希函数有什么问题呢?聪明的你一眼就看出来了:容易出现碰撞。因为不同的键的首字母有可能是一样的,就意味着返回的索引也是一样的

例如我们假设哈希表的大小为 10 ,我们以上面的歌手名作为键然后执行 simple_hash(key, 10) 得到索引

image-20231124111316696.png

可以看到,由于Juice WRLD 和 J.cole 的首字母都一样,哈希函数返回了相同的索引,这里就发生了哈希碰撞

虽然几乎不可能完全避免任何大量数据的碰撞,但一个好的哈希函数加上一个适当大小的哈希表将减少碰撞的机会

当出现哈希碰撞时,可以使用不同的方法(例如开放寻址法)来解决碰撞

应该设计健壮的哈希函数来尽量避免哈希碰撞

我们再来看其他的键,Kanye 通过 simple_hash() 函数返回 index 5,这意味着我们可以在索引 5 (哈希表的第六个元素)上找到 其键 Kanye 和值Come to life

image-20231124140016486.png

哈希表优点

在哈希表中,是根据哈希值(即索引)来寻找数据,所以可以快速定位到数据在哈希表中的位置,使得检索、插入和删除操作具有常数时间复杂度 O(1) 的性能

与其他数据结构相比,哈希表因其效率而脱颖而出

不但如此,哈希表可以存储不同类型的键值对,还可以动态调整自身大小

Python 中的哈希表实现

在 Python 中有一个内置的数据结构,它实现了哈希表的功能,称为字典

Python 字典(dictionary,dict)是一种无序的、可变的集合(collections),它的元素以 “键值对(key-value)”的形式存储

字典中的 key 是唯一且不可变的,这意味着它们一旦设置就无法更改

my_dict = {"Kanye": "Come to life", "XXXtentacion": "Moonlight", "J.cole": "All My Life"}

在底层,Python 的字典以哈希表的形式运行,当我们创建字典并添加键值对时,Python 会将哈希函数作用于键,从而生成哈希值,接着哈希值决定对应的值将存储在内存的哪个位置中

所以当你想要检索值时,Python 就会对键进行哈希,从而快速引导 Python 找到值的存储位置,而无需考虑字典的大小

my_dict = {}
my_dict["Kanye"] = "Come to life" # 哈希函数决定了 Come to life" 在内存中的位置
print(my_dict["Alice"]) # "Come to life" 

可以看到,我们通过方括号[key]来访问键对应的值,如果键不存在,则会报错

print(my_dict["Kanye"])  # "Come to life" 
​
# Raises KeyError: "Drake"
print(my_dict["Drake"])

为了避免该报错,我们可以使用字典内置的 get() 方法,如果键不存在则返回默认值

print(my_dict.get('Drake', "Unknown")) # Unknown

在 python 中实现哈希表

首先我们定义一个 HashTable 类,表示一个哈希表数据结构

class HashTable:
    def __init__(self, size):
        self.size = size
        self.table = [None]*size
​
    def _hash(self, key):
        return ord(key[0]) % self.size

在构造函数 __init__() 中:

  • size 表示哈希表的大小
  • table是一个长度为 size 的数组,被用作哈希表的存储结构。初始化时,数组的所有元素都被设为 None,表示哈希表初始时不含任何数据

在内部函数 _hash() 中,用于计算给定 key 的哈希值。它采用给定键 key 的第一个字符的 ASCII 值,并使用取余运算 % 将其映射到哈希表的索引范围内,以便确定键在哈希表中的存储位置。

然后我们接着在 HashTable 类中添加对键值对的增删查方法

class HashTable:
    def __init__(self, size):
        self.size = size
        self.table = [None]*size
​
    def _hash(self, key):
        return ord(key[0]) % self.size
​
    def set(self, key, value):
        hash_index = self._hash(key)
        self.table[hash_index] = (key, value)
​
    def get(self, key):
        hash_index = self._hash(key)
        if self.table[hash_index] is not None:
            return self.table[hash_index][1]
​
        raise KeyError(f'Key {key} not found')
​
    def remove(self, key):
        hash_index = self._hash(key)
        if self.table[hash_index] is not None:
            self.table[hash_index] = None
        else:
            raise KeyError(f'Key {key} not found')

其中,set() 方法将键值对添加到表中,而 get() 该方法则通过其键检索值。该 remove() 方法从哈希表中删除键值对

现在,我们可以创建一个哈希表并使用它来存储和检索数据:

# 创建哈希表
hash_table = HashTable(10)
​
# 添加键值对
hash_table.set('Kanye', 'Come to life')
hash_table.set('XXXtentacion', 'Moonlight')
​
# 获取值
print(hash_table.get('XXXtentacion'))  # Outputs: 'Moonlight'
​
# 删除键值对
hash_table.remove('XXXtentacion')
​
# 报错: KeyError: 'Key XXXtentacion not found'
print(hash_table.get('XXXtentacion'))

前面我们提到过,哈希碰撞是使用哈希表时不可避免的一部分,既然 Python 字典是哈希表的实现,所以也需要相应的方法来处理哈希碰撞

在 Python 的哈希表实现中,为了避免哈希冲突,通常会使用开放寻址法的变体之一,称为“线性探测”(Linear Probing)

当在字典中发生哈希冲突时,Python 会使用线性探测,即从哈希冲突的位置开始,依次往后查找下一个可用的插槽(空槽),直到找到一个空的插槽来存储要插入的键值对。

这种方法简单直接,可以减少哈希冲突的次数。但是,它可能会导致“聚集”(Clustering)问题,即一旦哈希表中形成了一片连续的已被占用的位置,新元素可能会被迫放入这片区域,导致哈希表性能下降

为了缓解聚集问题,假若当哈希表中存放的键值对超过哈希表长度的三分之二时(即装载率超过66%时),哈希表会自动扩容

最后总结一下:

  • 在哈希表中,是根据哈希值(即索引)来寻找数据,所以可以快速定位到数据在哈希表中的位置
  • Python 的字典以哈希表的形式运行,当我们创建字典并添加键值对时,Python 会将哈希函数作用于键,从而生成哈希值,接着哈希值决定对应的值将存储在内存的哪个位置中
  • Python 通常会使用线性探测法来解决哈希冲突问题

a

---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的 它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。)是通过哈希表实现的。每个字典项都是一个键值对(key-value pair),其中键是唯一的,并且通过一个哈希函数映射到表中的位置。:哈希函数接受一个输入(键),并返回一个整数(哈希值)。:当一个新的键值对需要被插入到哈希表中时,首先使用哈希函数计算键的哈希值,然后将该键值对存储在由哈希值指定的位置。:查找操作与插入类似,通过哈希函数找到键对应的哈希值,然后直接访问该位置来检索值。 阅读详情

相关推荐

使用python实现哈希表、字典、集合

哈希表 哈希表(Hash Table, 又称为散列表),是一种线性表的存储结构。哈希表由一个直接寻址表和一个哈希函数组成。哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标。 简单哈希函数: 除法哈希:h(k) = k mod m 乘法哈希:h(k) = floor(m(kA mod 1)) 0<A<1 假设有一个长度为7的数组,哈希函数h(k) = k mod ...

m0_37595954的博客 501

Python篇——数据结构与算法(第六部分:哈希表)

【代码】Python篇——数据结构与算法(第六部分:哈希表)

qq_42120059的博客 5783

Python中的哈希表

一种解决冲突的方法是使用链表,即在哈希表每个位置上存储一个链表,将冲突的元素加入到这个链表的末尾。当进行查找时,先使用哈希函数计算出元素应该在哈希表的位置,然后在对应的链表上线性地查找元素。哈希表的实现基于哈希函数,将给定的输入映射到一个固定大小的表格中,每个表项存储一个关键字/值对。哈希表的时间复杂度取决于哈希函数的持续均匀,因此对于一个给定的哈希表和哈希函数,最好的方法是进行实验和调整,以达到最优的性能和效率。哈希函数使用Python的内置哈希函数,并对哈希表大小进行取模操作。插入到哈希表的这个位置(

Echo_Wish 2229

Python数据结构与算法篇(六)-- 哈希表

散列表(hash table),又名‘hash表’,它用的是数组支持按照下标随机访问数据(时间复杂度O(1))的特性,散列表其实就是基于数组结构的一种扩展。散列表这种数据结构虽然支持非常高效的数据插入、删除、查找操作,但是散列表中的数据都是通过散列函数打乱之后无规律存储的。也就说,它无法支持按照某种顺序快速地遍历数据,所以我们常常会将散列表和链表(或者跳表)结合在一起使用。

CarpeDiem 4770

Python基础052:散列表在python中是以字典dict的形式实现的

你可以这样创建散列表: book=dict() book["apple"]=0.67 book["milk"]=1.49 book["egg"]=0.56 print(book) print(book["milk"]) 输出: {'apple': 0.67, 'milk': 1.49, 'egg': 0.56} 1.49 也可以这样创建(输出跟上面的是一样的): book={"apple": ...

若北辰 519

显著性算法 + 伪彩变换

利用opencv得到显著图和伪彩图

正在挣扎中的人 2298

Python——什么是hashable

官方文档解释 1)如果一个对象是可哈希的,则它是可被计算哈希值的(__hash__()),以及是可比较的(__eq__())。 2)可哈希对象可作为字典的键,或集合的成员。 3)Python所有的内置不可变对象都是可哈希的。如:数值、字符串,元组等。 4)列表,字典,集合是不可哈希的,因为它们在改变值的同时却没有改变内存 id(这意味着无法通过哈希值来确定唯一的对象),无法由地址定位值的唯一性,...

My Blogs 2892

Cadence ADE实战:1GHz VCO相位噪声仿真全流程(附PSS/Pnoise避坑指南)

本文详细介绍了在Cadence ADE环境中对1GHz VCO进行相位噪声仿真的完整流程。重点剖析了PSS(周期性稳态分析)和Pnoise(周期性噪声分析)两大核心引擎的关键参数设置与避坑指南,帮助射频与模拟IC设计者准确评估VCO性能,解决仿真不收敛、结果异常等常见问题。

rock5的博客 671

Python 字典和集合的的实现:散列表

字典和集合的效率高,和他背后的散列表是绕不开的。 散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。散列表的单元叫做表元bucket。在dict的散列表中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对于值的引用。因为表元的大小一致,所以可以通过偏移量来读取表元。python会保证大概有三分之一的表元是空的,快要达到这个阈值的时候,原有的散列表会被复制到一个更大的空间里面。 散列值的相等: 内置的hash()方法是调用对象的__hash__。如果两个对象比较

lijiachang8的博客 547

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6689

【ros2】从零认识URDF:机器人模型描述的“说明书”

visual>子节点只负责机器人在RViz2中的可视化效果,不参与任何物理计算,就像给零件“穿衣服”。<origin>:定义零件的局部坐标系相对于连杆原点的位姿,参数xyz表示平移(单位:米),rpy表示旋转(单位:弧度,绕x→y→z轴旋转);<geometry>:定义零件的几何形状,支持四种基础形状+外部3D模型;<material>:定义零件的颜色,需要提前定义材质。常见几何形状示例-- 连杆名称:base_link(底座),全局唯一 --> < visual > <!

EnHengNa的博客 1614

散列表的设计与实现_python基础之字典与集合实现

更多内容,欢迎关注微信公众号: tmac_lover上一篇介绍python中字典和集中时,提到,字典和集合的优势在于增删改查非常高效,而高效的原因就在于,python中字典和集合这两个数据结构是基于散列表 来实现的。散列表也叫哈希表,英文是hashtable。是一种非常高效的基础数据结构,今天我们介绍一下散列表的原理,了解了原理之后,就会很容易理解为什么 字典和集合的增删改查如此高效。什么是散列表...

weixin_36111677的博客 359

X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (二) 摩尔纹的产生机理

1,横向摩尔纹的表现 2,纵向摩尔纹的表现 3,摩尔纹在pitch = 143μm(注:pitch为采样间隔/周期)的FPD上的表现。 4,摩尔纹的危害(严重的影响了临床诊断) 5,摩尔纹对胸片肺部肺纹理的破坏 6,滤线栅的频率(滤线栅生产厂家的产品参数)。判断摩尔纹产生的重要依据之一 7,DR平板探测器的采样频率/空间极限分辨率 l.........

松下J27录放机 4981

python 哈希表_Python字典的内部实现:数据结构哈希表

散列表(哈希表、Hash Table)是基本的数据结构之一,综合了数组和链表的优点,平均情况下,在查找、删除、插入操作上,都能实现O(1)的复杂度。本文介绍哈希表的内部基本原理:hash()函数的设计和冲突的解决;并简单介绍python内部dict的实现。hash()函数:将key映射为index哈希表中内部有一块连续的内存区域,即数组,但与数组不同,哈希表通过 hash()函数将一个元素的key...

weixin_39946266的博客 483

在 SAP BAS 中扩展标准 SAP Fiori 应用并部署到 ABAP 环境的完整实践指南

SAPUI5 Adaptation Project 摘要(148字) SAPUI5 Adaptation Project 提供了一种高效扩展标准Fiori应用的方式,通过创建应用变体(Application Variant)实现差异化定制。开发者可在SAP BAS中使用可视化编辑器修改UI元素(如隐藏字段、调整表格布局、添加按钮等),而无需重写业务逻辑。变体部署到ABAP环境后,可与标准应用并行使用,且能随原应用升级保持同步。典型应用场景包括为不同用户角色定制简化界面或增强特定功能,既满足个性化需求,又保留

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

29、网络支持技术:CDN、覆盖网络与无标度网络解析

本文详细解析了CDN路由方式与性能指标,探讨了覆盖网络与无标度网络的特性及其在云计算和现代网络中的应用。文章分析了CDN的关键技术与挑战,介绍了覆盖网络与小世界网络的基本原理,并深入讨论了无标度网络的构建算法、性能优化策略以及在多个领域的应用案例。最后,文章展望了未来网络技术发展趋势与无标度网络的结合潜力。

night的博客 89

python 哈希表_python 字典底层实现原理

python 字典底层实现原理python字典底层是通过哈希表来实现的,也就是所字典底层也是一个列表,当我们用字典当中的`key`去获取对应的`value`时,会将`key`转换为列表当中的`index`,通过`index`去准确快速的获取到`value`,哈希表的时间复杂度为O(1)。哈希表(散列表)哈希表是一种以 `key-value`存储数据的结构,我们只需要输入需要查找数据的`key`,就...

weixin_39792803的博客 500

Golang内存管理:GC调优实战案例

在Golang编程中,内存管理是一个非常重要的方面。良好的内存管理可以提高程序的性能和稳定性,而GC(垃圾回收)调优则是优化内存管理的关键手段。本文的目的就是通过实际案例,深入讲解Golang中GC调优的方法和技巧,让读者能够在实际项目中更好地进行内存管理和性能优化。范围涵盖了从核心概念的解释到具体代码实现和调优过程的详细分析。本文首先会介绍一些相关的术语和核心概念,让读者对Golang内存管理和GC有一个基本的认识。然后通过故事引入的方式,更加形象地解释核心概念及其相互关系。

AI Agent Harness Engineering 1118

python字典的哈希实现_python 哈希表实现简单python字典代码实例

class Array(object):def __init__(self, size = 32, init = None):self._size = sizeself._items = [init] * sizedef __getitem__(self, index):return self._items[index]def __setitem__(self, index, value):sel...

weixin_39858132的博客 324

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python的hashmap_使用python实现哈希表、字典、集合操作

哈希表哈希表(Hash Table, 又称为散列表),是一种线性表的存储结构。哈希表由一个直接寻址表和一个哈希函数组成。哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标。简单哈希函数:除法哈希:h(k) = k mod m乘法哈希:h(k) = floor(m(kA mod 1)) 0假设有一个长度为7的数组,哈希函数h(k) = k mod 7,元素集合{14, 22, 3, 5}的...

weixin_39759107的博客 934

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python字典的工作原理:深入理解哈希表实现

Python字典是一种基于哈希表的高效数据结构,支持快速的键值对存储和查找操作。哈希表通过哈希函数将键映射到数组中的特定位置,实现O(1)时间复杂度的插入、查找和删除。哈希函数需具备确定性、均匀性和高效性,以确保键的哈希值分布均匀。Python字典使用开放寻址法处理哈希冲突,并通过动态扩容机制保持低负载因子,从而维持高效性能。字典的键必须是可哈希的不可变对象,如整数、字符串和元组。理解字典的底层机制有助于优化其使用和性能。

shangjg3的博客 1023

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python 第九天:集合与字典-基于哈希表的实现

在 Python 中,通常使用**字典(dict)**实现映射这种数据结构。:字典中的键(Key)必须是不可变的数据类型,但值(Value)可以是任意数据类型。,即将一个元素(键/Key)与一个对应的值(Value)关联起来。还提供了一些常用方法,主要包括集合的。函数创建集合,或将列表转为集合。创建集合,元素之间使用逗号(包裹,每个键值对使用冒号()分隔,键值对之间使用逗号(除了以上两种常见操作,

xhy0987的博客 191

python 字典 哈希_Python 字典和集合基于哈希表实现

哈希表作为基础数据结构我不多说,有兴趣的可以百度,或者等我出一篇博客来细谈哈希表。我这里就简单讲讲:哈希表不过就是一个定长数组,元素找位置,遇到哈希冲突则利用 hash 算法解决找另一个位置,如果数组长度不够用则进行扩容,然后不断地循环反复。我们提到了字典和集合是由哈希表实现的,具体的实现过程是怎么样的呢?其实很简单,字典里面有取值,添加值,正好对应的就是哈希表中的find和add方法。使用__g...

weixin_39553156的博客 287
上一篇: Python文件操作:JSON、CSV、TSV、Excel和Pickle文件序列化
下一篇: Python-pyCirclize包详细使用攻略!
Python_P叔
博客等级 码龄3年 5451粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值