我有一个应用程序处理以下结构中的数据:
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
按时间顺序指向下一个Node
,next_name
指向属于Node
的下一个message->name
。 Root
结构指向每种类型的第一个。
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的消息等。
然而,我担心这可能比它需要的更复杂。我也担心维护(见下文)。我需要搜索/选择/读取操作非常快,我认为它们是。我需要插入操作才能合理快速。但是现在,对于我插入的每个Message
,我必须(1)更新一些next_time
指针和(2)更新一些next_name
指针。
我的问题是: 是否存在提供此类功能的数据结构?如果没有,我是否正确处理了这个问题?
如果可能,请提供C ++或C#中的任何代码示例。
感谢。
附加:假设稍后我想添加到我的Message
结构中。假设我添加一个名为City
的字段。现在,我可能想要这样做:
City
的所有数据并dostuff()
这需要添加next_city
,然后对于每次插入,我都必须更新next_time
,next_name
和next_city
。
此外,假设我想这样做:
City
和特定name
的所有数据并dostuff()
我认为这会让问题变得更加困难,除非我选择遍历每个Message
并跳过我不关心的问题。
答案 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)中运行