我发现SortedList<TKey, TValue> SortedDictionary<TKey, TValue>并Dictionary<TKey, TValue>实现相同的接口.
SortedList还是SortedDictionary结束Dictionary?SortedList和SortedDictionary应用方面?这似乎与这个问题重复,后者询问" SortedList和SortedDictionary之间有什么区别?" 不幸的是,答案只是引用MSDN文档(它清楚地表明两者之间存在性能和内存使用差异),但实际上并没有回答这个问题.
事实上(根据MSDN,这个问题没有得到相同的答案):
的
SortedList<TKey, TValue>通用类是O(log n)的检索,其中n是字典中的元件的数目的二进制搜索树.在这里,它类似于SortedDictionary<TKey, TValue>泛型类.这两个类具有相似的对象模型,并且都具有O(log n)检索.两个类别的不同之处在于内存使用和插入和移除速度:
SortedList<TKey, TValue>使用的内存少于SortedDictionary<TKey, TValue>.
SortedDictionary<TKey, TValue>对于未排序的数据,O(log n)具有更快的插入和删除操作,而不是O(n)SortedList<TKey, TValue>.如果列表是从排序数据中一次性填充的,
SortedList<TKey, TValue>则速度快于SortedDictionary<TKey, TValue>.
所以,显然这表明这SortedList<TKey, TValue>是更好的选择,除非您需要更快的插入和删除未排序数据的操作.
问题仍然存在,鉴于以上信息,使用a的实际(现实世界,商业案例等)原因是SortedDictionary<TKey, TValue>什么?根据绩效信息,这意味着根本没有必要SortedDictionary<TKey, TValue>.
这是像这样的问题的延续.
是否有任何调整性能的指导原则?我并不是指大O的收益,只是节省一些线性时间.
例如,要花多少钱预分类保存在任SortedList或SortedDictionary?
假设我有一个有3个属性的人类排序,其中一个是年龄.我应该先按年龄换取物品吗?
我应该首先对一个属性进行排序,然后使用结果列表/字典对两个属性进行排序,依此类推?
想到的任何其他优化?
我需要一个数据结构,可以通过与它们关联的浮动键对对象进行排序,最先降低.问题是密钥代表成本所以经常有重复,我不关心这个,因为如果两个具有相同的成本,我只会抓住第一个,因为它没有区别,问题是编译器抱怨.
是否存在行为方式相同但允许重复键的数据结构?
编辑 - 我仍然需要重复项,因为如果一个结果是一个死胡同,我抓住下一个(他们是一个*搜索中的节点)
所以为了清楚起见,它需要允许按顺序排序的重复键.
我有一个Foo包含对象列表的类:List<Bar>.每个Bar属性都有一个属性,可以对它们进行排序(类型TimeSpan,表示持续时间),并且Bar是一个不可变对象 - 也就是说,持续时间不会随着算法的运行而改变.目前,对于每一个Foo我也保持Bar在列表中的第一个如果它被订购(即Bar最短的持续时间).像这样的东西:
public class Foo
{
public List<Bar> AllBars { get; set; }
public Bar FirstBar { get; set; }
public Foo (Bar bar)
{
FirstBar = bar;
AllBars = new List<Bar>() { bar };
}
public AddBar(Bar bar)
{
if(bar.Duration < FirstBar.Duration)
{
FirstBar = bar;
}
AllBars.Add(bar);
}
}
Run Code Online (Sandbox Code Playgroud)
此类Foo用于处理性能(速度)至关重要的算法中.记忆很重要但不如速度快.有一个n Foo s 列表,每个都有m Bar s.直到这一刻,这门课一直很好.我现在希望为用户提供多种选择,这意味着我需要提供Bar对列表中前几个s的随机访问. …
我看到了这个问题.
如何在.Net 3.5中获取SortedDictionary中的最后一个元素.
我正在使用SortedDictionaries来模拟一个队列(由于我有一些要求),我在排序的字典上调用Last()来获取我需要出列的项目.
我只是想知道使用自定义比较器并调用First()或继续调用Last()的性能.
在反编译.NET 3.5程序集之后,我发现SortedDictionary类确实有一个Count属性,所以我猜测框架只返回调用First时位置0的项目,以及位置[count-1]时的项目最后一个叫,我是对的?
基本上我有一个点列表,每个点都有X,Y,Z(Z总是相同的).
例如:
pointList.add(Point p = new Point(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)
但是我无法将它们按顺时针顺序排序.
我知道中心,我知道每个列表中大约有600个点.
我以前用Python完成了这个,但是我在C#中遇到了麻烦.
Python代码:
pointlist.sort(key=lambda c:atan2(c[0], c[1]))
Run Code Online (Sandbox Code Playgroud) 我必须存储这些数据:
"AL" => 1997
"AK" => 1977
...
"WY" => 1997
Run Code Online (Sandbox Code Playgroud)
在.NET中存储这个的最佳方法是什么?我应该只使用数组,arrayList或其他集合吗?
我想听听您对 C# 中管理时间序列的最佳方法的看法。我需要有一个类似于二维矩阵的 Datetime 对象作为行索引(有序且不重复),并且每列将代表相关 Datetime 的股票值。我想知道这些对象中的任何一个是否能够处理日期的缺失数据:添加列或时间序列会在行索引中添加缺失的日期,并会添加“null”或“N/a”现有日期缺失值。
与 C++ 相比,C# 中已经提供了很多东西,我不想错过一些明显的东西。
我正在实施Bentley-Ottman 算法,该算法需要扫描线 (SL) 具有以下属性的数据结构:
T,其中T是IComparable<T>,O(log count),并且应该返回元素是否已经插入,O(log count),e(无论是否已经在集合中),我需要e排序顺序旁边的集合的上一个和下一个元素。SortedList<TKey, TValue>有O(count)at 插入和删除,因为它必须移动列表中的所有连续元素。但是,O(1)一旦我知道e.
SortedDictionary<TKey, TValue>并SortedSet<T>有O(log count)插入和删除,但我找不到任何迭代器给我下一个和上一个元素。
是否有任何实现可以为我提供完整的功能?
如果没有,实现它的最快方法是什么?LinkedList<T>不允许二分查找。List<T>仍然有O(count)插入/删除。我真的必须实现我自己的平衡树吗?
c# ×9
.net ×5
collections ×3
performance ×3
sortedlist ×3
sorting ×3
dictionary ×2
.net-3.5 ×1
arrays ×1
coordinates ×1
datetime ×1
generics ×1
icomparable ×1
linq ×1
time-series ×1