【问题标题】:Triple list VS double dictionary三重列表 VS 双字典
【发布时间】:2016-05-01 15:37:57
【问题描述】:

我有 40.000 个文档,每个文档 93.08 个单词。平均而言,每个单词都是一个数字(可以索引字典),每个单词都有一个计数(频率)。阅读更多here

我介于两种存储数据的数据结构之间,想知道我应该选择哪一种,Python 人会选择哪一种!

三重列表:

一个列表,其中每个节点:

__ 是一个列表,其中每个节点:

__.... 是两个值的列表; word_idcount

双字典:

一个字典,键为 doc_id 和值字典。

该值字典将以 word_id 作为键,以 count 作为值。


我觉得第一个需要更少的空间(因为它不存储doc_id),而第二个会更容易处理和访问。我的意思是,访问列表中的 i 元素是 O(n),而它在字典中是常量,我认为。我应该选择哪一个?

【问题讨论】:

  • 访问列表的第 i 个元素是 O(1)。
  • 一个简单的链表是 O(n) @RushyPanchal。
  • 访问索引确实是 O(1),但在列表中查找具有未知索引的元素是 O(n)
  • Python 列表不是链表,它们类似于 Java ArrayList 或 C++ 向量。它们是动态增长的数组,您可以通过计算偏移量来随机访问它们。但是,是的,在许多语言中,单词列表默认意味着链表。
  • 这里是 Python 列表时间复杂度的一个很好的参考:wiki.python.org/moin/TimeComplexity

标签: python list dictionary document bigdata


【解决方案1】:

您应该使用字典。它将使处理您的代码更容易理解和编程,并且它的复杂性也会降低。

您使用列表的唯一原因是您是否关心文档的顺序。

【讨论】:

  • 但这需要更多空间,对吧?我不关心订单。 ;)
  • @gsamaras 作为 N 的因子,它不会。
  • @gsamaras 唯一的额外空间是键,但 Python 字符串每个字符串只在内存中存储“一次”——也就是说,如果每个元素都有相同的键集,那么它是一个恒定的额外空间(可以忽略不计)。
  • @RushyPanchal 哪些字符串? doc_idword_idcount 是数字,确切地说是整数。伙计,当然是大写的,但实际上呢?
  • @gsamaras 是字典的键,除非您将它们存储为其他东西。但是,如果您为了清楚起见而使用字典,那么将字符串用作键似乎也很直观。
【解决方案2】:

如果您不关心项目的顺序,则绝对应该使用字典,因为字典用于对关联数据进行分组,而列表通常用于对更通用的项目进行分组。

此外,在字典中查找比在列表中查找要快。

在列表中查找是 O(n),而在字典中查找是 O(1)。虽然列表在内存中比列表大得多

【讨论】:

  • 是的,我不在乎订单!
【解决方案3】:

基本上你只想存储大量的数字,最节省空间的选择是array。这些是一维的,因此您可以编写一个包含三个索引的类(最后一个是 0 代表 word_id,1 代表 count)并进行一些基本的加法和乘法运算以找到正确的一维索引。

【讨论】:

  • 为什么会遭到反对?我会投赞成票,因为这个想法似乎还不错,而投反对票的人并没有证明他/她的行为是正当的。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 2015-08-11
  • 2016-12-20
  • 1970-01-01
  • 2021-09-19
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多