我无法弄清楚该Contains
方法在 an 中查找元素ArrayList
所需的时间与我编写的用于执行相同操作的小函数所需的时间之间的差异。该文档指出Contains
执行线性搜索,因此它应该是 inO(n)
而不是任何其他更快的方法。但是,虽然确切的值可能不相关,但该Contains
方法会在00:00:00.1087087
几秒钟内返回,而我的函数需要00:00:00.1876165
. 它可能不多,但是在处理更大的数组时,这种差异会变得更加明显。我错过了什么,我应该如何编写我的函数来匹配Contains
的表现?
我在 .NET 3.5 上使用 C#。
public partial class Window1 : Window
{
public bool DoesContain(ArrayList list, object element)
{
for (int i = 0; i < list.Count; i++)
if (list[i].Equals(element)) return true;
return false;
}
public Window1()
{
InitializeComponent();
ArrayList list = new ArrayList();
for (int i = 0; i < 10000000; i++) list.Add("zzz " + i);
Stopwatch sw = new Stopwatch();
sw.Start();
//Console.Out.WriteLine(list.Contains("zzz 9000000") + " " + sw.Elapsed);
Console.Out.WriteLine(DoesContain(list, "zzz 9000000") + " " + sw.Elapsed);
}
}
编辑:
好的,现在,小伙子们,看:
public partial class Window1 : Window
{
public bool DoesContain(ArrayList list, object element)
{
int count = list.Count;
for (int i = count - 1; i >= 0; i--)
if (element.Equals(list[i])) return true;
return false;
}
public bool DoesContain1(ArrayList list, object element)
{
int count = list.Count;
for (int i = 0; i < count; i++)
if (element.Equals(list[i])) return true;
return false;
}
public Window1()
{
InitializeComponent();
ArrayList list = new ArrayList();
for (int i = 0; i < 10000000; i++) list.Add("zzz " + i);
Stopwatch sw = new Stopwatch();
long total = 0;
int nr = 100;
for (int i = 0; i < nr; i++)
{
sw.Reset();
sw.Start();
DoesContain(list,"zzz");
total += sw.ElapsedMilliseconds;
}
Console.Out.WriteLine(total / nr);
total = 0;
for (int i = 0; i < nr; i++)
{
sw.Reset();
sw.Start();
DoesContain1(list, "zzz");
total += sw.ElapsedMilliseconds;
}
Console.Out.WriteLine(total / nr);
total = 0;
for (int i = 0; i < nr; i++)
{
sw.Reset();
sw.Start();
list.Contains("zzz");
total += sw.ElapsedMilliseconds;
}
Console.Out.WriteLine(total / nr);
}
}
我为我的函数的两个版本(前向和后向循环)和默认函数平均运行了 100 次Contains
。对于我的函数来说,我得到的时间是毫秒,136
而
对于这个版本来说133
是一个遥远的赢家。好吧,如果在您争辩说数据稀缺之前,我的结论是基于第一次独立运行的,您对这个测试有什么看法?不仅平均表现更好,而且在每次运行中都能获得始终如一的更好结果。那么,对于 3rd 方功能,这里是否存在某种劣势,或者什么?87
Contains
Contains