2

我有一个锯齿状的 Array String[][]String[n][0] 现在我需要在我所拥有的东西 中找到具有特定值的数组,这很简单

foreach foo in bar{
 if(foo[0]==needle){
  return foo;
 }
}

正如您所见,由于显而易见的原因,这非常慢。我是 C# 新手,刚刚看到 indexOf,但是如何在锯齿状数组中使用 indexOf?

我坚持的另一种方法是对数组进行排序String[n][0],转到中间的记录,检查我的值是更大还是更大,跳入上/下区域的一半等等,也许是 3 或 4 次,这样我就可以了更快地找到记录。

那么在我只知道的锯齿状阵列中获取阵列的最快方法是什么[][0]

4

3 回答 3

4

我会使用Dictionary<int, int[]>where 键是数组的第一项。字典具有恒定的时间访问,如果整个数据都适合内存,则随机访问非常快。

于 2011-03-03T12:18:27.717 回答
3

也许您更适合使用字典而不是锯齿状数组,其中键是每个数组的第一项。由于字典是哈希表,因此查找速度应该很快。

// Some test data.    
var dictionary = new Dictionary<string, string[]>
{
    { "foo1", new string[] { "foo1", "bar1" }},
    { "foo2", new string[] { "foo2", "bleh" }},
    { "foo3", new string[] { "foo3", "bar3", "hello", "world" }},
    { "foo4", new string[] { "foo4",  }},
    { "foo5", new string[] { "foo5", "bar5", "test" }},
};

string[] item = dictionary["foo3"]; // Fast look up.
于 2011-03-03T12:25:03.347 回答
2

好吧,您正在寻找一个值,而不是array[i][0]每个ifrom 0to的值n,对吗?然后,它与锯齿状数组无关,而是在集合中找到一个值(在您的情况下是{array[i][0], for each 0 <= i < n )

如果您只想搜索一次,那么可以做的最好的事情就是您自己的解决方案,它在线性时间上运行:O(n)

如果您要搜索多次(不更改array[i][0]any i),那么您可以对数组进行排序String[n][0]并执行“二进制搜索”,这正是您描述的算法。排序需要O(n lgn)时间。但是每次搜索都会非常快O(lg n)

于 2011-03-03T12:25:02.490 回答