Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 多级遍历的数据结构_Algorithm_Oop_Design Patterns_Language Agnostic_Linked List - Fatal编程技术网

Algorithm 多级遍历的数据结构

Algorithm 多级遍历的数据结构,algorithm,oop,design-patterns,language-agnostic,linked-list,Algorithm,Oop,Design Patterns,Language Agnostic,Linked List,我有一个处理以下结构数据的应用程序: struct Message { int time; string name; string details; }; 例如,我可能有一个如下所示的数据集: 9:00:00 Bob <Info> 9:01:00 John <Info> 9:05:00 Bob <Info> 9:11:00 Mary <Info> 9:17:00 John <Info> 9:25:00 Ma

我有一个处理以下结构数据的应用程序:

struct Message
{
   int    time;
   string name;
   string details;
};
例如,我可能有一个如下所示的数据集:

9:00:00 Bob  <Info>
9:01:00 John <Info>
9:05:00 Bob  <Info>
9:11:00 Mary <Info>
9:17:00 John <Info>
9:25:00 Mary <Info>
9:30:00 Bob  <Info>
其中next_time按时间顺序指向下一个节点,next_name指向属于message->name的下一个节点。根结构指向每种类型的第一个

struct Root 
{
   Node* first_time;
   Node* first_bob;
   Node* first_john;
   Node* first_mary;

   Node* last_time;
   Node* last_bob;
   Node* last_john;
   Node* last_mary;
};
这里有一张图片来说明这一点

这种结构允许我相当容易地遍历每条消息,或者只遍历Bob的消息,或者只遍历John的消息,等等

然而,我担心这可能比它需要的更复杂。我还担心维护问题,见下文。我需要搜索/选择/读取操作非常快,我认为它们确实如此。我需要插入操作的速度相当快。但现在,对于我插入的每一条消息,我必须1更新下一次指针,2更新下一次名称指针

我的问题是: 是否已经存在提供此类功能的数据结构?如果没有,我是否正确处理了这个问题

请提供C++或C中的任何代码示例,如果可能的话。 谢谢

附加:假设稍后我要添加到消息结构中。假设我添加了一个名为City的字段。现在,我可能想这样做:

按时间顺序收集特定城市的所有数据,并记录 这需要添加下一个城市,然后对于每个插入,我必须更新下一次、下一个名称和下一个城市

此外,假设我想这样做:

收集特定城市和特定名称的所有数据,按时间顺序和时间顺序排列
我认为,除非我选择遍历每条消息并跳过那些我不关心的消息,否则这会让问题变得非常困难。

我可能会创建一个类来表示用户,将用户按名称等标识符存储在哈希表中,然后让每个用户持有按时间顺序排序的消息列表,它们还存储在一个全局列表中,该列表按时间顺序保存每个人的消息。对于每个添加的消息,您必须在每个列表中按列表插入一次,我指的是一些集合,可能是log n time,也可能是n,具体取决于数据结构。

一个简单的链接列表,包含按时间排序的所有消息

struct Node
{
   Message* message;
   Node*    next_name;
};
这将满足需求1。您可以在O1中添加和获取所有内容

一个单独的hashmap,其中User作为键,Node*列表作为值

Hashmap
{key = User, value = List(Message*)}

这将满足需求2。您可以在特定用户O1列表的末尾添加一个新条目,getAllOfUser也可以在O1中运行

将有多少不同的用户?如果这个数字很小,你可能只需要跳过你不感兴趣的消息就可以了。@takteek:我考虑过了-人/用户/姓名的数量是任意的,而且会有点小,但是每个人的消息数量会非常大。有可能我最终会跳过大量的消息你需要高效的随机插入还是仅仅追加?@user807566如果你的消息必须按时间顺序发送,你怎么能仅仅追加?如果你还没有看过,Boost似乎是一个明显的选择。
Hashmap
{key = User, value = List(Message*)}