算法学习笔记1----算法简介

1.1算法是一组完成任务的指令,任何代码片段都可视为代码。

1.2二分查找:

在一个有序的元素列表(必须有序)。如果要查找的元素包含在列表中,则返回其位置;否则返回null。

工作原理:每次都从列表的中间进行查找,每次都排除一半的数字。

例:在1-100中找到一个我想的数。从50开始,小了,就找50-100之间的数75,大了,就找1-50之间的数25;以此类推,每次减少一半的数字,最终找到想要的数。

100-->50-->25-->13-->7-->4-->2-->1   7步

1.3简单查找。就是傻找,一个一个的按着顺序查找,不漏任何一个数。

简单查找需要n步,而二分查找需要log2n步。

1.4Python代码实现二分查找

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

    while low <= high:
        mid = (low + high) / 2
        guess = list[mid]
        if guess == item:
            return mid
        elif guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None

my_list = [1, 3, 5, 7, 9]

print(binary_search(my_list, 1))
print(binary_search(my_list, -1))

练习.(1).假设有一个包含128个名字的有序列表,使用二分查找需要多少步?

                    log2128 = 7步

        (2).上面列表翻倍后最多需要几步?

                log2256 = 8步

1.5运行时间。

设计程序,一般而言应选择效率最高的算法,以最大限度的减少运行时间或占用空间。

简单查找的查找次数和列表长度相同,这被称为线性时间。

二分查找的运行时间为对数时间。

1.6.大O表示法

算法的运行时间以不同的速度增加。

大O表示法指出了算法有多快,即指出了算法运行时间的增速。简单查找运行时间为O(n)。二分查找运行时间为O(log n)。

大O表示法指出了最糟情况下的运行时间。

一些常见的大O运行时间:

O(log n),也叫对数时间,这样的算法包括二分查找。

O(n), 也叫线性时间,这样的算法包括简单查找。

O(n * log n), 这样的算法包括快速排序----一种速度较快的排序算法。

O(n2), 这样的算法包括选择排序----一种速度较慢的排序算法。

O(n!), 一直非常慢的算法,类似旅行商问题的解决方案算法。

练习:

(1). 在电话簿中根据名字查找电话号码。

O(logn)

(2).在电话簿中根据电话号码找人。(提示:你必须查找整个电话簿。)

O(n)

(3). 阅读电话簿中每个人的电话号码。

O(n)

(4).阅读电话簿中姓名以A打头的人的电话号码。这个问题比较棘手,它涉及第4章的概念。答案可能让你感到惊讶!

O(n),大O表示法不考虑乘以、除以、加上或减去的

1.7.小结

  • 二分查找的速度比简单查找快的多
  • O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快的越多。
  • 算法运行时间并不以秒为单位
  • 算法运行时间是从其增速的角度度量的
  • 算法运行时间用大O表示法表示




猜你喜欢

转载自blog.csdn.net/qq_41805514/article/details/80052673
今日推荐