谈谈算法复杂度与二分查找

编程对于工科学生的重要性不言而喻,如果你喜欢这篇文章,欢迎一起交流学习!欢迎交流:mate595@126.com

写在前面:我写C写惯了。python总是会加分号,像强迫症一样,大家别介意啊。

 

二分查找是非常简单的算法了,就是在有序list中进行查找,复杂度O(log n)。例如100个元素查找一个元素,最坏情况是查找:log_2 100 \approx 6.64 \approx 7

好一点的查找是散列表查找法,python里面直接用字典实现了,先给二分的代码:

def binary_search(list, item):
	low = 0;
	high = len(list) - 1;

	while low <= high:
	# In py3 integer's division need '//'
		mid = ( low + high )//2; 
		guess = list[mid];

		if guess == item:
			return mid;
		if guess < item:
			low = mid + 1;
		else:
			high = mid - 1;

		if low==high:
			if list[low]==list[len(list)-1]:
				print('The item is too large.');
			else:
				print('The item is too small.');
	return None;

my_list = [1,2,3,4,5,6,7,8,9];

print(binary_search(my_list,3));

算法复杂度

大O表示法是一种特殊的表示法, 指出了算法的速度有多快。大O表示法指出了最糟情况下的运行时间。


假设你使用简单查找在电话簿中找人。 你知道, 简单查找的运行时间为O (n ), 这意味着在最糟情况下, 必须查看电话簿中的每个条目。 如果要查找的是Adit——电话簿中的第一个人, 一次就能找到, 无需查看每个条目。 考虑到一次就找到了Adit, 请问这种算法的运行时间是O (n )还是O (1)呢?

简单查找的运行时间总是为O (n )。 查找Adit时, 一次就找到了, 这是最佳的情形, 但大O表示法说的是最糟的情形。 因此, 你可以说, 在最糟情况下, 必须查看电话簿中的每个条目, 对应的运行时间为O (n )。 这是一个保证——你知道简单查找的运行时间不可能超过O (n )。
 

下面按从快到慢的顺序列出了经常会遇到的5种大O运行时间。

 

  1. O (log n ), 也叫对数时间 , 这样的算法包括二分查找。
  2. O (n ), 也叫线性时间 , 这样的算法包括简单查找。
  3. O (n * log n ), 这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。
  4. O (n^2 ), 这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。
  5. O (n !), 这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值