【问题标题】:C# Fast way to find value in a jagged ArrayC# 在锯齿状数组中查找值的快速方法
【发布时间】:2011-03-03 12:13:41
【问题描述】:

我有一个锯齿状数组String[][]。现在我需要在String[n][0] 中找到具有特定值的数组 我有一个简单的时刻

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

正如您所见,这很慢,原因很明显。我是 C# 新手,刚刚看到 indexOf,但是如何在锯齿状数组中使用 indexOf?

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

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

【问题讨论】:

  • “慢”是什么意思? “bar”包含多少个一维数组,你需要多久进行一次这样的搜索,你得到了什么性能,你想要达到什么性能?
  • 你描述的排序跳转方法叫en.wikipedia.org/wiki/Binary_search_algorithm
  • 嗯,我有大约 25k foo 和 25k 针。我不知道具体需要多长时间,但我想大约需要 30 分钟。我需要把它缩短到大约 5 分钟。
  • 当 foo[0] 在搜索之间没有变化时,创建一个像 Elian Ebbing 建议的字典将在几秒钟内完成。
  • @user##,你的意思是 30 分钟还是 30 毫秒?

标签: c# performance jagged-arrays


【解决方案1】:

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

【讨论】:

  • 字典不允许您拥有相同的键。如果两个数组的第一个整数元素相同会怎样?您的字典中有两个不同的数组具有相同的键!
【解决方案2】:

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

// 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.

【讨论】:

    【解决方案3】:

    嗯,您正在为从0n 的每个i 搜索一个超出array[i][0] 的值,对吧? 然后,它与锯齿状数组无关,而是在集合中查找值(在您的情况下是 {array[i][0], for each 0 &lt;= i &lt; n )

    的集合

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2011-06-10
      • 1970-01-01
      • 2019-02-18
      相关资源
      最近更新 更多