Language agnostic 什么时候使用地图有意义?

Language agnostic 什么时候使用地图有意义?,language-agnostic,data-structures,dictionary,map,mapping,Language Agnostic,Data Structures,Dictionary,Map,Mapping,当使用map(一组键值条目)有意义时,我试图总结一些案例。到目前为止,我有两个类别(见下文)。假设存在更多,它们是什么 请将每个答案限定为一个唯一的类别,并举例说明 属性值() 存在,具有O(1)性能 稀疏数据结构(例如稀疏数组或矩阵): 此外,我认为您列出的“状态”示例最好使用一个集合数据结构(例如Java或.NET中的HashSet),因为映射的“映射”部分实际上是不必要的。记住函数结果(缓存、缓冲等) 正如Eric Petroleje所说,与地图相比,你的“存在”示例更适合于场景 但是,

当使用map(一组键值条目)有意义时,我试图总结一些案例。到目前为止,我有两个类别(见下文)。假设存在更多,它们是什么

请将每个答案限定为一个唯一的类别,并举例说明


属性值()

存在,具有O(1)性能

稀疏数据结构(例如稀疏数组或矩阵):


此外,我认为您列出的“状态”示例最好使用一个集合数据结构(例如Java或.NET中的HashSet),因为映射的“映射”部分实际上是不必要的。

记住函数结果(缓存、缓冲等)


正如Eric Petroleje所说,与地图相比,你的“存在”示例更适合于场景

但是,如果要跟踪事件发生的次数,请使用地图。例如,您想知道给定单词在文档中出现的次数:

伪代码:

wordMap = map()
for word in document:
    if wordMap.containsKey(word):
        wordMap[word]++
    else:
        wordMap[word] = 1

然后,如果我想知道单词“map”在文档中出现了多少次,那么它应该是
wordMap[“map”]

map是一种表示文档的方式。键是图中的节点,特定节点N的值是N连接到的所有节点的列表。

peter -> pierre
john  -> jean
paul  -> paul

如果您的语言同时允许关联数组和指向函数/过程的指针,那么您可以使用映射来构建类似于面向对象的东西(参见Perl的经典示例)

请参见此处以获取一个。

(感谢您的重新标记,MatrixProg。)

字典(将术语映射到定义)

也属于这一类

EADDRINUSE    -> "Address in use." 
EADDRNOTAVAIL -> "Address not available."

以不支持的语言向函数传递任意数量的可选参数:

cars = findAvailableCars(make -> 'Toyota', model -> 'Prius', color -> 'green')

实用例子:当你需要一个集合,而你的语言中只包含映射时,一个[任何小类型]的值映射是一个不错的替代品。说实话,我不明白问题是什么。基本上,这个列表是无限的,只要宇宙中还有一些东西还没有与其他东西联系在一起。至少我不知道如何判断答案……@andras:是的,你可以用地图建模的东西是无限的。但这些模型应该有分类/分类/分组。我将选择最吸引人/最令人兴奋的答案。我应该补充一点,OP希望排除多重贴图。我会将它们重新组合在“直方图”下,例如单词出现次数、测试分数等。
值。。。是一个列表。
当你开始这样思考时(也就是
值是一个映射
),问题的范围就爆炸了。我想用标量(或零维)值保持这个简单。我不确定我是否完全理解它,但它很有趣。你能举个例子吗?如果你看看Perl是如何向语言中添加OO元素的,你会发现很多信息。基本上,如果您可以使用“方法签名”作为键,“函数指针”作为值,那么您可以使用hashmap添加“面向对象的行为”。因此,方法签名(基本上是字符串)映射到函数,如
paul->dealWithPaul()
。让我想到工厂方法:
pizza->bakePizza()
。好+1。它还允许您使用topping->(topping成分列表)定义属性,例如。如果你考虑C++如何使用一个虚函数表来确定调用哪种方法(基础或派生),那么我想这就是他在这里得到的。基类设置签名到其方法的映射,派生类可以用自己的方法替换这些映射,从而更改类的行为。
wordMap = map()
for word in document:
    if wordMap.containsKey(word):
        wordMap[word]++
    else:
        wordMap[word] = 1
peter -> pierre
john  -> jean
paul  -> paul
"postulate" -> "demand or claim"
"consulate" -> "residence of a foreign official"
EADDRINUSE    -> "Address in use." 
EADDRNOTAVAIL -> "Address not available."
cars = findAvailableCars(make -> 'Toyota', model -> 'Prius', color -> 'green')