Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#_Linq_Range_Sortedlist - Fatal编程技术网

C# 可快速返回子阵列的排序时间序列数据的最佳数据结构?

C# 可快速返回子阵列的排序时间序列数据的最佳数据结构?,c#,linq,range,sortedlist,C#,Linq,Range,Sortedlist,我需要一个基本上是数据点列表的数据结构,其中每个数据点都有一个时间戳和一个双[]数据值。我希望能够检索到距离给定时间戳最近的点或指定时间戳范围内的所有点 我用的是c。我的想法是可以使用常规列表,其中“datapoint”是一个包含时间戳和double[]字段的类。然后要插入,我将使用内置的binarysearch()查找插入新数据的位置,并且可以再次使用它查找范围搜索的开始/结束索引 我第一次尝试了SortedList,但似乎你不能通过索引I=0,1,2,…,n,仅仅通过键进行迭代,所以我不知道

我需要一个基本上是数据点列表的数据结构,其中每个数据点都有一个时间戳和一个双[]数据值。我希望能够检索到距离给定时间戳最近的点或指定时间戳范围内的所有点

我用的是c。我的想法是可以使用常规列表,其中“datapoint”是一个包含时间戳和double[]字段的类。然后要插入,我将使用内置的binarysearch()查找插入新数据的位置,并且可以再次使用它查找范围搜索的开始/结束索引

我第一次尝试了SortedList,但似乎你不能通过索引I=0,1,2,…,n,仅仅通过键进行迭代,所以我不知道如何在没有复杂函数的情况下进行范围搜索

但后来我了解到list的insert()是o(n)…我能在不牺牲其他地方的情况下做得更好吗


或者,是否有一些很好的linq查询可以在一行中完成我想要的所有操作?

如果您愿意使用非BCL库,则该查询对我来说一直都很有效


它有一个很好的方法,可以很好地解决这类问题。

您可以选择插入、检索或删除时的成本。针对每种情况都有各种优化的数据结构。在您决定一个之前,我将估计您的结构的总大小、生成的数据点数量(以及频率)以及将更频繁地使用的内容:插入或检索

如果你以高频率插入大量新数据点,我建议你看看LinkedList。如果要更频繁地检索,我会使用列表,即使它的插入时间较慢


当然,您可以在LINQ查询中这样做,但请记住这只是糖衣:查询每次都会执行,每次执行时都会搜索整个数据点集以找到匹配项。这可能比首先为作业使用正确的集合要昂贵。

使用实际数据库存储数据并对其运行查询如何?
然后,您可以使用。

如果您只有静态数据,那么任何实现IList的结构都可以。对其排序一次,然后使用BinarySearch进行查询。如果插入的时间戳总是在增加,那么也应该可以这样做,只需在O(1)中执行List.Add(),它仍然会被排序

    List<int> x = new List<int>();
    x.Add(5);
    x.Add(7);
    x.Add(3);

    x.Sort();

    //want to find all elements between 4 and 6
    int rangeStart = x.BinarySearch(4);

    //since there is no element equal to 4, we'll get the binary complement of an index, where 4 could have possibly been found
    //see MSDN for List<T>.BinarySearch
    if (rangeStart < 0)
        rangeStart = ~rangeStart;

    while (x[rangeStart] < 6)
    {
        //do you business
        rangeStart++;
    }
List x=新列表();
x、 增加(5);
x、 增加(7);
x、 增加(3);
x、 排序();
//要查找4到6之间的所有元素吗
int rangeStart=x.BinarySearch(4);
//由于没有等于4的元素,我们将得到一个索引的二进制补码,其中可能会找到4
//有关List.BinarySearch,请参见MSDN
如果(范围开始<0)
rangeStart=~rangeStart;
while(x[rangeStart]<6)
{
//你有生意吗
rangeStart++;
}
如果需要在结构中的随机点插入数据,保持其排序并能够快速查询范围,则需要一个名为的结构。它不是在框架中实现的,您需要自己去实现它

在最坏的情况下,插入记录需要O(logn)操作

在最坏的情况下,查找记录需要O(logn)操作

在最坏的情况下,删除(以前定位的)记录需要O(log n)操作

在最坏的情况下,使用范围内的k个元素执行范围查询需要O((logn)+k)操作

备注:“是否有一些很好的linq查询可以在一行中完成我想要的一切”


我希望我知道这样一个好的linq查询,它可以在一行中完成我想要的一切:-)

LinkedList的范围搜索速度会非常慢,尽管他说他正在尝试优化。我同意,但这取决于几个因素。如果不用秒表测试,我不会相信软事实。我见过使用LinkedList实际上更快的案例。这要视情况而定。正如我所说的,如果有更多的插入导致O(n)变得昂贵,那么LinkedList会因为O(1)而表现得更好。如果有更多的检索,排序列表的性能几乎比其他任何东西都好。