【发布时间】:2017-01-07 05:30:03
【问题描述】:
我有一个使用数组的程序,有时我必须检查一个 lsit 值是否在数组中,执行此操作的函数需要大约 70% 的程序 CPU 时间,所以我想知道是否有一种更有效地做到这一点的方法。
这些是我的功能:
private static int[] GenerateRow(int length, Random RNG)
{
int[] row = InitalizeRow(length);
int index = 0;
while (!AreAllNumbersGenerated(row))
{
int value = RNG.Next(0, length);
if (!RowContains(row, value))
{
row[index] = value;
index++;
}
}
return row;
}
private static bool AreAllNumbersGenerated(int[] row)
{
for (int i = 0; i < row.Length; i++)
if(!RowContains(row, i))
return false;
return true;
}
private static bool RowContains(int[] row, int value)
{
for (int i = 0; i < row.Length; i++)
if (row[i] == value)
return true;
return false;
}
所有的工作都是由AreAllNumbersGenerated(),然后是RowContains(),最后是这一行:
if (row[i] == value)
这个函数花费大部分时间是正常的,因为它们工作繁重,但我想知道是否有更好的方法来做到这一点。
编辑:
private static int[] InitalizeRow(int length)
{
int[] row = new int[length];
for (int i = 0; i < length; i++)
row[i] = -1;
return row;
}
【问题讨论】:
-
如果你要生成“一切”,为什么不直接使用随机播放?
-
不知道是什么,我去查一下。
-
肯定有更好的方法来做
GenerateRow方法所做的事情。但是关于这种方法的问题是什么?还是AreAllNumbersGenerated?后者是否用于您程序中的其他内容? -
1) 听哈罗德的。如果您无论如何都要生成所有数字,请生成它们并执行随机播放。 2)如果没有,使用 HashSet
在 O(1) 时间内进行查找。这个号码已经生成了吗? 查看哈希集。 3) 但实际上,随机播放。即使使用 HashSet 提供的快速查找,您最终还是会花费大量时间与已经生成的值发生冲突。
标签: c# arrays performance