Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于存储数值数据的适当类型,并能够插值_C#_Data Structures_Types_Interpolation - Fatal编程技术网

C# 用于存储数值数据的适当类型,并能够插值

C# 用于存储数值数据的适当类型,并能够插值,c#,data-structures,types,interpolation,C#,Data Structures,Types,Interpolation,我正在读取成对的数据xvalue,yvalue,我想知道存储它们的最佳方式是什么。此时,我正在列表中执行此操作,不需要ObservableCollection,因为数据将在程序运行时保持不变。但是我需要能够对几个两个数据源进行一些操作。由于这两个源之间的xv值可能不相同,因此我需要线性插值 我读过字典、LinkedList等书,我不知道我需要什么,以及什么更适合这个小项目 当我开始制作填充缺失数据点的方法时,我遇到了几个困难: 我需要检查series1中的每个点,如果xValue与series2

我正在读取成对的数据xvalue,yvalue,我想知道存储它们的最佳方式是什么。此时,我正在列表中执行此操作,不需要ObservableCollection,因为数据将在程序运行时保持不变。但是我需要能够对几个两个数据源进行一些操作。由于这两个源之间的xv值可能不相同,因此我需要线性插值

我读过字典、LinkedList等书,我不知道我需要什么,以及什么更适合这个小项目

当我开始制作填充缺失数据点的方法时,我遇到了几个困难:

我需要检查series1中的每个点,如果xValue与series2中的相同,但是由于xValue是有序的,我认为检查整个列表中的每个值会对性能造成很大损害,只是说,不,没有这个xValue,让我们插值并插入新的点

我怎样才能在两个值之间插入一个点,而不是给定索引,而是值x2>x1


我认为这是一个常见的问题,当你在编程中使用2D数据点时,你知道是否有一些东西是用C实现的,或者是否有代码可以启发我

您想要使用X-Y对的排序列表,列表将是适合的类型。让我们假设您有两个输入列表,series1和series2,它们按X值排序,您正在检查series2,并可能对series1中存在的X值进行插值,正如您在问题中所述。因为您需要检查序列1中的每个坐标,所以最小复杂性为On

保持这种效率的关键是列表是有序的,这意味着您不必在整个series2列表中搜索series1中的每个X值。要做到这一点,请在序列2中保留指向当前项的指针,并在遍历序列1时移动它。这里是pseudo-C来说明我的意思

var s2idx = 0;
foreach(s1 in series1)
{
    // go forward through series2 until you find the next interp target
    while(series2[s2dix].Item1 < s1.Item1 && s2idx < series2.Length)
        s2idx++;
    if(s2idx == series2.Length)
        // all s1 Xs are > the biggest s2 X, so just add the rest of the s1 points to your output 
        // or whatever else you want to do, then quit the foreach loop
    var s2 = series2[s2idx];
    if(s1.Item1 == s2.Item1)
        // Xs are equal, handle this case as you like
    else
        // calculate the interpolated point and put it in your output
}
我已经用数组列表展示了这一点,但是你可以用链表同样有效地实现这一点;只需使用当前指针来跟踪序列2中的位置,而不是索引


这里的复杂性是Om+n,因为在最坏和[最有可能]平均的情况下,您分别遍历两个列表一次。最佳情况为启用,但这只会发生在退化实例中所有series1 X值都大于最小series2 X值,或者series2为空。请记住,这需要对两个列表进行排序,因此您需要查看Om+n+m log m+n log n all TOLLED。请注意,这种复杂性主要取决于排序成本,这意味着它相当有效。

您知道相同的xValue是否会出现多次吗?如果不是,我认为字典可能是查找最快的。不,我不希望垂直线或每个xValue有一个以上的y值。谢谢。要插值,你需要看两个点,一个小一个大。这意味着你将不知道你正在寻找的价值观,因此一本关于再三思考的字典是没有帮助的。您需要某种类型的列表/分类列表,可能是元组。如果列表已排序,则可以使用Linq查找比点小的最大值,并假定最小值大于下一个点。