我正在阅读数据对(xValues
,yValues
),我想知道存储它们的最佳方式是什么。此时我在List<double>,
ObservableCollection
中执行此操作不是必需的,因为数据在程序运行时中将保持不变。但是我需要能够使用几个(两个)数据源进行一些操作。由于这两个源之间的xValues
可能不一样,我需要线性插值。
我读过Dictionary
,LinkedList
之类的内容,我对我需要的内容感到困惑,哪些内容更适合这个小项目。
当我开始制作填充缺失数据点的方法时,我遇到了一些困难:
如果xValue
与series2中的相同,我需要检查series1中的每个点,但是由于xValues是有序的,我认为检查整个列表中的每个值都会对性能造成严重损害比如说,不,没有xValue
,让我们插入并插入新点。
如何在两个未给定索引但是值(x2> x1)之间插入一个点。
我认为这是一个常见的问题,当您在编程中使用2D数据点时,您是否知道C#中是否存在某些内容,或者是否有代码可以让我受到启发?
答案 0 :(得分:0)
您想要使用X-Y对的排序列表(class
将是适合的类型)。假设您有两个输入列表,系列1和系列2,它们按X值排序,您正在检查系列1中存在的X值的系列2(并可能插值)(正如您在问题中所述)。因为您需要检查series1中的每个坐标,所以O(n)的最小复杂度。
保持此效率的关键是列表是有序的,这意味着您不必搜索series1中每个X值的整个series2列表。你可以通过保持指向series2中当前项目的指针,并在遍历series1时移动它来完成此操作。这是伪C#来表示我的意思。
metaclass
我使用数组列表显示了这一点,但您可以使用链接列表高效地执行此操作;只需使用“当前”指针来跟踪您在series2中的位置而不是索引。
这里的复杂性是O(m + n),因为你每次遍历两个列表(在最差和最可能的平均情况下)。最好的情况是O(n),但这只会发生在退化实例中(所有series1 X值都大于最小的series2 X值,或者series2为空)。请记住,这需要对两个列表进行排序,因此您要查看O(m + n + m log m + n log n)。请注意,这种复杂性主要取决于分类成本,这意味着它非常有效。