【问题标题】:Advice about what kind of data structure to use for quick search times C++关于使用哪种数据结构进行快速搜索的建议 C++
【发布时间】:2011-08-20 00:54:19
【问题描述】:

我目前正在考虑可能用于当前项目的数据结构。我不需要删除项目,因为我正在加载数据库,使用它,然后退出程序。唯一的限制与搜索时间有关。(第二次记忆,但主要是时间)。

概述我打算做什么。 我正在解析文件并提取用于创建各种对象的信息。 读取文件并创建对象后,我有一组多个对象,这些对象以字符串形式引用其他对象。

这里的目标是找出从一个域到另一个域的网络

例如:文本输入文件:

module Blabla 
netTomodule Foo
domain 1
..../*Other parameters of the module*/
end module

module Foo 
netTomodule Blabla
netTomodule Foo2
domain 2
..../*Other parameters of the module*/
end module

module Foo2
netTomodule Foo
domain 2
..../*Other parameters of the module*/
end module

阅读本文后,我得到 3 个模块对象 Foo Foo2 和 Blabla,它们的属性如下:

class Module{
private :
string name;
int domain;
netlist * mynetlist;
...
}  

我的意见和我想得到建议的事情:

考虑到这一点,我认为我最好的办法是:

  1. 在读取文件和提取信息时,我应该创建一个模块的链表。
  2. 然后根据我已读取的模块数量,我创建一个大小是其两倍的数组。
  3. 对于每个模块,我使用哈希函数对模块名称进行哈希处理,并将指向该模块的指针放在数组中的给定索引处
  4. 现在,当我想找到一个模块时,我只需要计算哈希值并获取给定索引处的指针(或者如果它不是好的模块,因为之前在制作数组时发生冲突,则增加)

这基本上是一个哈希表的实现,或者至少是我从我的班级中知道的一个哈希表。

我的问题是 这是个好主意吗?有没有我可以使用的哈希表库?(我听说过并寻找 unordered_map 和 map,但我不知道它是否非常适合我的需求)

这是一个巨大的文本,所以我希望它足够详细,所以如果你有勇气阅读所有内容,谢谢!

【问题讨论】:

  • 你的问题很难理解,因为里面有很多不相关的信息和重复。尝试专注于基本内容,避免使用空洞的短语(“你应该知道的是……”)。
  • 如果不知道要对模块执行什么操作,就很难回答。您要解决的总体问题是什么?
  • 我进行了编辑以更清楚地表明这里的目标是找到从一个域到另一个域的网络(即有一个网络 netween Foo 和 Blabla 从 2 到 1 跨域)跨度>

标签: c++ data-structures


【解决方案1】:

只需使用标准库或boost 附带的任何哈希表。大多数将有unordered_map(由TR1指定并为C ++ 0x提出)和boost一样,但有些会有std::hash_mapstdext::hash_map,各种实现略有不同,例如最初的 SGI 与微软。

不需要建立列表,直接将对象放入哈希表即可;它允许顺序迭代,尽管它会以某种固定的随机顺序进行。

【讨论】:

  • 嗨,我想这就是我要做的。我被我们在 C 课上所做的事情误导了,老师告诉我们知道哈希表初始化的元素数量。谢谢:)
【解决方案2】:

如果您也对间接关系感兴趣 (Foo2->Foo->BlaBla),那么您基本上有一个图表。在这种情况下,您可以使用Boost.Graph

【讨论】:

  • 谢谢,但我只对非传递关系感兴趣!
【解决方案3】:

您可以维护一个哈希表(字符串 => 指向模块类型对象的指针)而不是链接列表。

再次在类Module中,再次维护一个hashmap或一个字符串映射=>指针

【讨论】:

  • 我在课堂上被告知要制作一个哈希表,我必须知道其中包含的元素数量(要有一个两倍大小的哈希表)。这就是为什么我在 OP 中说我创建了一个链表来计算元素的数量,然后通过它来计算哈希值。 // 这是不真实的吗?我可以直接使用哈希表往里面放东西吗?
  • @djfoxmccloud:每一个合理的哈希表都会自动调整大小。 unordered_map 确实如此,到目前为止我所看到的标准库附带的所有其他 hash_map 实现也是如此。
  • @djfoxmccloud :我只是提出了一个解决方案。就计算对象的数量而言,即使这样做,您也不必创建链接列表。您可以在读取文件以创建模块对象时即时计算它们。因此,一旦创建了所有对象,您就会知道大小。网络(或模块对象中的链接)也是如此,当您获得结束标签“结束模块”时,您将知道大小
  • 一旦创建,对象必须放置在某个容器中。所以它们要么直接放在哈希映射中,要么必须放在临时容器中。
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
相关资源
最近更新 更多