例如,我运行了这个示例代码,它枚举了所有 52 张牌中选出 7 张牌的可能情况,总共有133,784,560种不同的情况:
var intDict = new Dictionary<int, int>();
var intList = new List<int>();
for (int i = 0; i < 100000; i ++)
{
intDict.Add(i, i);
intList.Add(i);
}
int result;
var sw = new Stopwatch();
sw.Start();
for (int card1 = 0; card1 < 46; card1++)
for (int card2 = card1 + 1; card2 < 47; card2++)
for (int card3 = card2 + 1; card3 < 48; card3++)
for (int card4 = card3 + 1; card4 < 49; card4++)
for (int card5 = card4 + 1; card5 < 50; card5++)
for (int card6 = card5 + 1; card6 < 51; card6++)
for (int card7 = card6 + 1; card7 < 52; card7++)
result = intDict[32131]; // perform C(52,7) dictionary key lookups
sw.Stop();
Console.WriteLine("time for dictionary lookups: {0} ms", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int card1 = 0; card1 < 46; card1++)
for (int card2 = card1 + 1; card2 < 47; card2++)
for (int card3 = card2 + 1; card3 < 48; card3++)
for (int card4 = card3 + 1; card4 < 49; card4++)
for (int card5 = card4 + 1; card5 < 50; card5++)
for (int card6 = card5 + 1; card6 < 51; card6++)
for (int card7 = card6 + 1; card7 < 52; card7++)
result = intList[32131]; // perform C(52,7) array index lookups
sw.Stop();
Console.WriteLine("time for array index lookups: {0} ms", sw.ElapsedMilliseconds);
输出结果为:
time for dictionary lookups: 2532 ms
time for array index lookups: 313 ms
这种行为是否是可以预期的(性能下降了8倍)?如果我没记错,一个字典平均查找的时间复杂度为O(1),而数组最坏情况下查找的时间复杂度也是O(1),所以我确实希望数组的查找速度更快,但并不会快到这个程度!
目前,我正在使用字典来存储扑克牌手牌等级。如果这已经是字典查找的最快速度,那么我必须重新思考我的方法并改用数组,虽然索引等级可能有点棘手,我可能还需要问另一个问题。