我的数据结构知识太生疏了,老实说,这从来都不是我的强项。
现在我们要构建一个类似队列的组件,它具有以下要求:
- 必须能够排队、出列和按键查找特定项目。
- 每个项目将是一个结构或类,以另一个类为键,具有 5 个不同的属性,类似于类别。假设类似:MasterCategoryId、ChildCategoryId、TimeId、PriorityId、GroupId。
- 它必须是一个排序集合。
- 通常,该集合将容纳 5k 到 10k 个对象,但为了考虑最坏的情况,我们正在测试我们当前的原型以容纳大约一百万个对象。
- 现在它不会是多线程的。
- 集合中大约 90% 或 95% 的项目(排队)将在创建组件时发生,但该组件被用作树,从某种意义上说,我们将出列集合中的最后一个项目,请计算它,然后它将它的结果报告给它的父级,它可能已经在集合中,也可能不在集合中。如果不是,则用于尝试查找父项的队列方法将不得不插入该项目。
- 由于组件就像一个正在处理的队列,因此在将所有内容出列后集合将为空。
我想总结一下。因此,显然单个列表或有序列表是不可能的,因为每次我们从集合中添加或删除对象时,它都会再次排序,并且在具有一百万个对象的单个集合中执行此操作很慢。
我们过去测试了几种方法,例如链表,事实证明这种方法排队速度快,但查找项目慢(因为我们确实有这种情况)。
现在我们已经想出了一个像这样的结构
SortedDictionary<int, SortedDictionary<int, SortedDictionary<int, SortedDictionary<int, SortedDictionary<int, ..
你明白了。
这是分组级别的最佳选择,保持每个集合相对较小(每个字典大约 300 个项目)。
因此,对于第一级,我们将有一个 sorteddictionary,其键是每个主类别的 id,值将是一个 sorteddictionary,其键将是子类别的 id……等等.
现在我们已经测试了 100、1,000、10,000、100,000 和 1,000,000 个项目。
对于较小的范围,高达 100k,解决方案很快。它可以在不到一秒的时间内排队/出队/查找,甚至高达 300k,这确实高于我们将处理的 80-90% 的场景。
当涉及到一百万时,它确实会变得更慢,大约需要 3-4 秒来排队整个事情,最多需要 10 秒才能耗尽队列。
所以,我的问题是:
- 是否有更适合我们特定场景的集合或方法?
- 我以前从未使用过这么多的收藏品。对于如此高的数字,这些时间安排是否合理?我之所以问是因为我读过一些推文,这些人在 MSMQ 或 NserviceBus 之类的东西上每秒执行 20 万次操作(我知道这与此无关,我只是想理解和比较我的结果)。
- 我现在在原型中使用的对象只是模拟类,只是复合对象键和单个属性。当我使用真正的课程时,我的结果会受到影响吗?我猜不是,因为所有框架都会添加对对象的引用,但只是想确认一下,因为就像我说的那样,数据结构从来都不是我最擅长的知识。
- 作为一个单独的主题,如果我想为多线程做准备,我需要考虑哪些因素?
谢谢。