今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式。

线性查找:Contains,Find,IndexOf都是线性查找。

二分查找:BinarySearch,因为二分查找必须是对有序数组才有效,所以查找前要调用List的Sort方法。

结论:如果List项的个数比较小,用线性查找要略快于二分查找,项的个数越多二分算法优势越明显。可根据实际情况选用适合的查找方式。

测试结果:

测试代码:

        private void button1_Click(object sender, EventArgs e)
{
TestFind();
TestFind();
TestFind();
TestFind();
TestFind();
TestFind();
} private void TestFind(int aItemCount)
{
listBox1.Items.Add("测试:列表项个数:" + aItemCount + ",查询100万次");
int nTimes = ;
int nMaxRange = ; //随机数生成范围
Random ran = new Random();
List<int> test = new List<int>();
for (int i = ; i < aItemCount; i++)
{
test.Add(ran.Next(nMaxRange));
} int nHit = ;
DateTime start = DateTime.Now;
for (int i = ; i < nTimes; i++)
{
if (test.IndexOf(ran.Next(nMaxRange)) >= )
{
nHit++;
}
}
DateTime end = DateTime.Now; TimeSpan span = end - start;
listBox1.Items.Add("一般查找用时:" + span.Milliseconds + "ms, 命中次数:" + nHit); nHit = ;
start = DateTime.Now;
test.Sort();
for (int i = ; i < nTimes; i++)
{
if (test.BinarySearch(ran.Next(nMaxRange)) >= )
{
nHit++;
}
}
end = DateTime.Now; span = end - start;
listBox1.Items.Add("二分查找用时:" + span.Milliseconds + "ms, 命中次数:" + nHit);
listBox1.Items.Add("");
}

最新文章

  1. touchstart、touchmove、touchend 实现移动端上的触屏拖拽
  2. Spring任务调度之Quartz
  3. ◆linux分区的加密与自动解密◆——Super孟再创辉煌
  4. c语言编程之栈(链表实现)
  5. selenium 调用JS操作滚动条(java)来解决element not clickable的问题
  6. jQuery :lt()选择器
  7. 外接程序 VMDebugger 未能加载或导致了异常 修复
  8. Django--CRM--菜单展示, 删除合并, 权限展示
  9. js cookie跨域设置
  10. Django 跨域问题
  11. calendar 模块
  12. JavaScript语法详解:if语句&amp;for循环&amp;函数
  13. PHPExcel合并与拆分单元格
  14. 几种常用CSS3样式
  15. MacBook PRO蓝牙无法搜索设备
  16. 【2018北京集训6】Lcm DFT&amp;FWT
  17. CSS 属性-webkit-tap-highlight-color的理解
  18. python/numpy/pandas数据操作知识与技巧
  19. 打造自己的移动绿色版 Python 环境
  20. js数组添加或删除元素

热门文章

  1. 支持向量机(SVM)算法
  2. 基础向量运算-2D镜面反射
  3. C++ 高级语法学习与总结(代码实例)
  4. 如何根据不同的浏览器写不同的css样式达到兼容
  5. 16 款最流行的 JavaScript 框架
  6. HVTableView 分享组
  7. kvm虚拟机安装
  8. C++ / CLI 调用 C++ /Native 随记
  9. register based 和 stack based虚拟机的区别
  10. Oracle日期时间