多级遍历的数据结构

时间:2011-08-02 01:41:36

标签: 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 Mary <Info>
9:30:00 Bob  <Info>

我将有一个Message结构列表,代表数据集中的每一行。

我需要对这些数据进行的一些操作包括:

  • 按时间顺序收集所有数据并dostuff()
  • 按时间顺序收集John(或任何人)的所有数据dostuff()

所以,我需要一种遍历列表的方法,这样我就可以按时间顺序传递每条消息,并选择一个人,并按时间顺序仅传递他们的消息。

我的想法是有这样的结构:

struct Node
{
   Message* message;
   Node*    next_time;
   Node*    next_name;
};

其中next_time按时间顺序指向下一个Nodenext_name指向属于Node的下一个message->nameRoot结构指向每种类型的第一个。

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;
};

这是一张图片来说明这一点。

enter image description here

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

然而,我担心这可能比它需要的更复杂。我也担心维护(见下文)。我需要搜索/选择/读取操作非常快,我认为它们是。我需要插入操作才能合理快速。但是现在,对于我插入的每个Message,我必须(1)更新一些next_time指针和(2)更新一些next_name指针。

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

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

感谢。

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

  • 按时间顺序收集特定City的所有数据并dostuff()

这需要添加next_city,然后对于每次插入,我都必须更新next_timenext_namenext_city

此外,假设我想这样做:

  • 按时间顺序收集特定City和特定name的所有数据并dostuff()

我认为这会让问题变得更加困难,除非我选择遍历每个Message并跳过我不关心的问题。

2 个答案:

答案 0 :(得分:1)

我可能会创建一个表示用户的类,通过某些标识符(如名称)将用户存储在哈希表中,然后让每个用户按照时间顺序保存Message列表,这些列表也会存储在一个单独的全局列表中,按时间顺序保存每个人的Message。对于每个添加的Message,您必须在每个列表中插入一次(按列表我的意思是一些集合),这可能是log n时间,或者与n一样糟糕,具体取决于关于数据结构。

答案 1 :(得分:1)

所有邮件的简单链接列表(按时间排序)。

struct Node
{
   Message* message;
   Node*    next_name;
};

这将满足req 1.您可以在O(1)

中添加()和getAll()

一个单独的散列映射,其中User为键,Node *列为值。

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

这将满足req 2.您可以在特定用户O(1)列表的末尾添加新条目,getAllOfUser()也可以在O(1)中运行