【发布时间】:2017-01-28 18:42:50
【问题描述】:
我正在尝试解决一个问题,但我意识到我的解决方案的复杂性比预期的要高,因为 Insert for List<T> 是 O(n)(来源:https://msdn.microsoft.com/en-us/library/sey5k5z4(v=vs.110).aspx)。
我想要的是像
这样的数据结构- 顺序容器
- 具有在元素有序时有效的二进制搜索方法
- 在索引处插入优于 O(n)
- O(1) 获取容器中元素的数量
- O(1) 按索引查找
换句话说,我想要像List<T> 这样的东西,除了更快的插入。
【问题讨论】:
-
@MatthewCawley 我认为您不能使用
LinkedList<T>在 O(1) 中按索引访问元素。例如。做不到int median = LL[LL.Count/2]; -
我不知道这样的数据结构是否存在(听起来有点难以置信),但我猜有更奇怪的事情发生。您可能会在Computer Science 上获得更好的结果,因为这与 .NET 没有太大关系(绝对没有单一的内置集合)。此外,如果您描述需要这些属性的算法,可能会找到替代方案。
-
您说您需要按索引进行 O(1) 查找,但您的描述表明您实际上是在中间插入元素以保持某种顺序,并且不介意这会改变现有元素。所以这个要求很奇怪。如果您只需要一个容器,该容器可以通过优于 O(n) 的插入来有效地维护已排序的元素,那么
SortedSet<T>可以工作。它不允许重复,但可以通过存储包含T和计数的包装器类型来解决此问题,如果元素已经存在,则增加该计数。 -
在这里听起来像是一个 x-y 问题。你希望解决什么问题?
标签: c# .net algorithm data-structures