关联数组gydF4y2Ba
关联数组,也称为映射或字典,是一种gydF4y2Ba抽象数据类型gydF4y2Ba可以保存数据gydF4y2Ba(关键字,值)gydF4y2Ba对。gydF4y2Ba
你可以把关联数组想象成一个电话号码列表。在这个列表中,你可以通过找到一个人的电话号码来查找他的名字。名字是gydF4y2Ba价值gydF4y2Ba这个数字是gydF4y2Ba关键gydF4y2Ba.这个列表如下表所示:gydF4y2Ba
电话号码gydF4y2Ba | 的名字gydF4y2Ba |
1-203-456-4657gydF4y2Ba | John DoegydF4y2Ba |
1-964-725-5617gydF4y2Ba | 简·史密斯gydF4y2Ba |
1-275-486-8562gydF4y2Ba | 丹尼尔·布朗gydF4y2Ba |
1-347-374-3412gydF4y2Ba | John DoegydF4y2Ba |
关联数组有两个重要的属性。每一个gydF4y2Ba关键gydF4y2Ba只能出现一次,就像每个电话号码在通讯录中只能出现一次一样。,每gydF4y2Ba关键gydF4y2Ba只能有一个值,就像每个电话号码只能指一个人一样。在这个列表中有可能有两个人有相同的名字,所以重要的是要记住gydF4y2Ba价值gydF4y2Ba可以在关联数组中出现多次。gydF4y2Ba
内容gydF4y2Ba
最小所需功能gydF4y2Ba
关联数组有四种基本操作。gydF4y2Ba
函数名*gydF4y2Ba 提供的功能gydF4y2Ba 插入(关键字,值)gydF4y2Ba
添加一个gydF4y2Ba(关键字,值)gydF4y2Ba配对到关联数组gydF4y2Ba remove(键)gydF4y2Ba
删除gydF4y2Ba关键gydF4y2Ba在关联数组中gydF4y2Ba 更新(关键字,值)gydF4y2Ba
分配/更新gydF4y2Ba价值gydF4y2Ba现有的gydF4y2Ba关键gydF4y2Ba 查找(关键)gydF4y2Ba
返回gydF4y2Ba价值gydF4y2Ba分配给这个gydF4y2Ba关键gydF4y2Ba *不需要确切的名字。事实上,某些功能可以由特定的语言直接通过特殊的语法提供。gydF4y2Ba
使用列表的Python实现示例gydF4y2Ba
在Python中,关联数组是使用字典为您实现的。类实现此基元数据类型gydF4y2Ba哈希表gydF4y2Ba.此示例使用gydF4y2Ba数组gydF4y2Ba,值得注意的是,这是一个非常低效的实现。gydF4y2Ba
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24gydF4y2Ba |
|
Python的内置功能gydF4y2Ba
Python有自己的基本数据类型,即字典,它实现了关联数组的功能。让我们看看它是如何工作的:gydF4y2Ba
Python字典gydF4y2Ba
1 2 3gydF4y2Ba>>>gydF4y2Bamy_dictgydF4y2Ba=gydF4y2Ba{}gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba{}gydF4y2Ba
现在,只需使用特定的语法为键赋值,就可以向这个字典添加内容。让我们模拟前面的社会保险号示例。gydF4y2Ba
1 2 3 4 5gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba[gydF4y2BaOne hundred.gydF4y2Ba]gydF4y2Ba=gydF4y2Ba“泰勒”gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba[gydF4y2Ba101gydF4y2Ba]gydF4y2Ba=gydF4y2Ba“约翰。”gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba[gydF4y2Ba102gydF4y2Ba]gydF4y2Ba=gydF4y2Ba“艾比”gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba{gydF4y2BaOne hundred.gydF4y2Ba:gydF4y2Ba“泰勒”gydF4y2Ba,gydF4y2Ba101gydF4y2Ba:gydF4y2Ba“约翰。”gydF4y2Ba,gydF4y2Ba102gydF4y2Ba:gydF4y2Ba“艾比”gydF4y2Ba}gydF4y2Ba
现在,我们可以加上agydF4y2Ba不同的gydF4y2Bakey,它的值是Taylor,因为它不违反关联数组的任何原则。gydF4y2Ba
1 2 3gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba[gydF4y2Ba103gydF4y2Ba]gydF4y2Ba=gydF4y2Ba“泰勒”gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba{gydF4y2BaOne hundred.gydF4y2Ba:gydF4y2Ba“泰勒”gydF4y2Ba,gydF4y2Ba101gydF4y2Ba:gydF4y2Ba“约翰。”gydF4y2Ba,gydF4y2Ba102gydF4y2Ba:gydF4y2Ba“艾比”gydF4y2Ba,gydF4y2Ba103gydF4y2Ba:gydF4y2Ba“泰勒”gydF4y2Ba}gydF4y2Ba
在Python中,如果我们给字典中已经存在的键赋值,它将用新值更新该键。gydF4y2Ba
1 2 3gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba[gydF4y2Ba101gydF4y2Ba]gydF4y2Ba=gydF4y2Ba珍妮花的gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba{gydF4y2BaOne hundred.gydF4y2Ba:gydF4y2Ba“泰勒”gydF4y2Ba,gydF4y2Ba101gydF4y2Ba:gydF4y2Ba“Jeniffer”gydF4y2Ba,gydF4y2Ba102gydF4y2Ba:gydF4y2Ba“艾比”gydF4y2Ba,gydF4y2Ba103gydF4y2Ba:gydF4y2Ba“泰勒”gydF4y2Ba}gydF4y2Ba
我们可以使用pop方法删除一个键gydF4y2Ba
1 2 3 4gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba.gydF4y2Ba流行gydF4y2Ba(gydF4y2Ba103gydF4y2Ba)gydF4y2Ba“泰勒”gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba{gydF4y2BaOne hundred.gydF4y2Ba:gydF4y2Ba“泰勒”gydF4y2Ba,gydF4y2Ba101gydF4y2Ba:gydF4y2Ba“Jeniffer”gydF4y2Ba,gydF4y2Ba102gydF4y2Ba:gydF4y2Ba“艾比”gydF4y2Ba}gydF4y2Ba
最后,Python为字典提供了一些很酷的内置方法。以下是一些例子:gydF4y2Ba
1 2 3 4 5 6gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba.gydF4y2Ba键gydF4y2Ba()gydF4y2Ba[gydF4y2BaOne hundred.gydF4y2Ba,gydF4y2Ba101gydF4y2Ba,gydF4y2Ba102gydF4y2Ba]gydF4y2Ba>>>gydF4y2Ba一个gydF4y2Ba.gydF4y2Ba值gydF4y2Ba()gydF4y2Ba[gydF4y2Ba“泰勒”gydF4y2Ba,gydF4y2Ba“Jeniffer”gydF4y2Ba,gydF4y2Ba“艾比”gydF4y2Ba]gydF4y2Ba>>>gydF4y2BalengydF4y2Ba(gydF4y2Ba一个gydF4y2Ba)gydF4y2Ba3.gydF4y2Ba
例子问题gydF4y2Ba
想象一下,我们有一个电话号码列表和电话号码拥有者的名字。回答以下问题:gydF4y2Ba
- “Jane Doe”被赋予了一个新的电话号码。不幸的是,该名称已经存在于列表中。我们该怎么办?gydF4y2Ba
- “詹姆斯·布朗”丢掉了他的电话号码。我们能用他的旧电话号码给下一个有电话的人吗?gydF4y2Ba
- 在这种情况下允许使用更新功能吗?gydF4y2Ba
- A1。可以将不同的电话号码映射到这个名称。毕竟,一个关联数组中允许有多个相同值的实例。gydF4y2Ba
- A2。是的,这是可以的,因为我们已经从列表中删除了那个(键,值)对。gydF4y2Ba
- A3。当然,我们可以更新某人的电话号码,只要它没有被其他人使用。gydF4y2Ba
时间复杂度gydF4y2Ba
关联数组的具体实现对其运行时有很大的影响。gydF4y2Ba
操作gydF4y2Ba | 数组gydF4y2Ba | 红黑树gydF4y2Ba | 哈希表gydF4y2Ba |
插入gydF4y2Ba | **gydF4y2Ba | ||
删除gydF4y2Ba | **gydF4y2Ba | ||
更新gydF4y2Ba | **gydF4y2Ba | ||
查找gydF4y2Ba | **gydF4y2Ba |
**取决于碰撞处理。gydF4y2Ba
使用gydF4y2Ba数组gydF4y2Ba,就像gydF4y2Ba以上gydF4y2Ba,效率非常低。要执行任何操作,在最坏的情况下需要遍历数组中的每个对。因此,关联数组很少使用数组实现。gydF4y2Ba
红黑树gydF4y2Ba都比数组快得多。因为他们是gydF4y2Ba二叉搜索树gydF4y2Ba,它们可以被搜索到gydF4y2Ba 时间。与数组相比,这使得每个操作都更快。gydF4y2Ba
哈希表gydF4y2Ba是关联数组在计算机科学中如此受欢迎的原因。通过引入哈希函数,实现者可以保证相同的结果gydF4y2Ba关键gydF4y2Ba哈希会得到相同的结果吗gydF4y2Ba价值gydF4y2Ba每一次。然后,查找速度很快,因为您只需要在正确的单元格中查找gydF4y2Ba价值gydF4y2Ba.重要的是要注意,当两个不同的gydF4y2Ba键gydF4y2Ba哈希到相同的gydF4y2Ba价值gydF4y2Ba.有不同的方法来解决这些冲突(它们对运行时的影响都不同),但冲突通常是不希望的。gydF4y2Ba
关联数组的应用gydF4y2Ba
关联数组被广泛应用于计算机科学领域。它们经常在编程模式和范例中使用,例如gydF4y2Ba记忆有关gydF4y2Ba.该技术强调信息的存储和快速检索,并实现了信息的快速检索gydF4y2Ba备忘录gydF4y2Ba通常使用哈希表实现。gydF4y2Ba
中的所有对象gydF4y2BaJavaScriptgydF4y2Ba实际上是关联数组。gydF4y2BaJSONgydF4y2Ba,一个流行的网络通信标准,也是一个关联数组。随着基于javascript的web平台的兴起,JSON越来越受欢迎gydF4y2Banode . jsgydF4y2Ba.gydF4y2Ba
一个完整的数据库类型叫做gydF4y2BaNoSQLgydF4y2Ba数据库基于关联数组。这些数据库使用关联数组进行存储gydF4y2Ba(关键字,值)gydF4y2Ba对。这种类型的数据库专门用于gydF4y2Ba快gydF4y2Ba数据检索。和哈希表一模一样。gydF4y2Ba