算法与数据结构(一)

简介: 算法与数据结构(一)

目录


二分查找


运行时间


大O表示法(表示算法的速度)·····


常见的大O运行时间:


主要理解


主要理解




二分查找


假设要在字典中查找一个以o开头的单词,可以从头开始查找,直到进入以o开头的部分。但是你很有可能不这样做,而是从中间附近开始查找,因为你知道o在中间附近,明显也更合逻辑。


这是一个查找问题,可以使用算法二分查找来解决问题。


工作原理


我随便想一个1~100的数字,你的目标是以最少的次数猜中这个数字,你每次猜测后,我会说:小了,大了,或者对了。假若你从1开始猜,那你只能排除一个数字。


最佳的查找方法:


从50开始查找,小了或者大了都能排除一半的数字。假若50小了,那就再来75。不断的排除一半的数字,最终得到答案。


这就是二分查找,


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


七步就能够从100个数字内排除到最后的正确答案。    


说明:


仅当列表或者数据是有序排列时,二分查找才有效。          


那么我们来运行python来试试二分查找:


首先我们要查找的部分是从low到high;函数binary_search接受参数为一个有序数组和一个被查找的元素。

    low = 0
    high = len(list1)-1

我每次都要检查中间的元素:

   mid = (low + high) // 2
   guess = list1[mid]

如果数字猜小了, 就相应的修改low:

if guess < item:
  low = mid + 1

如果大了,就修改high。


完整的代码如下:

def binary_search(list1, item):
    low = 0
    high = len(list1)-1  # low 和 high用于跟踪要在其中查找的列表部分
    while low <= high:   # 只要范围没有缩小到只包含一个元素
        mid = (low + high) // 2  # 就检查中间的元素
        guess = list1[mid]
        if guess == item:  # 找到了元素
            return mid
        if guess > item:  # 数字猜大了
            high = mid - 1
        else:
            low = mid + 1  # 数字猜小了
    return None  # 没有指定的元素
my_list = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]  # 测试例子
print(binary_search(my_list, 3))  # 索引从0开始,第二个位置的索引为1
print(binary_search(my_list, 17))  

运行时间


说到算法,就离不开他的。运行时间。一般而言,应选择效率最高的算法,以最大限度的减少运行时间或占用的空间。


简单查找逐个的检查数字,如果列表包含100个数字,最多需要猜100次。换言之,最多需要猜测的次数与列表长度相同,这被称为线性时间(linear time)


简单查找的运行时间为:O(n)线性时间


二分查找的运行时间为:O(log n)对数时间


在下面会又更多的运行时间。

56.jpeg

大O表示法(表示算法的速度)·····


大O表示法指出了算法有多快的一种特殊表示法(运算运行时间的增速),定义为数量越多时算法运行时间的增速,增速越慢,代表算法越快。


知道算的快有什么用呢???其实蛮重要的哈,实际上,我们会经常用到别人编写的算法,在这种情况之下,知道这些算法的的速度就大有脾益。


注意


  • 大O表示法指的并非以秒为单位的速度

  • 大O表示法所表示的是一个算法在最糟糕情况下的运行时间(简单来理解就是运行所需要的最长的时间)


常见的大O运行时间:


是有点多的


  • O(1):是最低的时间复杂度,表示算法的速度和数量无关,不论数量是多少,算法的速度始终不变,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变

  • O(n):也叫线性时间,表示算法的速度和数量增加呈现线性增长

  • O(log n):也叫对数时间,是一种随着数量越多,算法耗时增速越慢的算法

  • O(n * log n):是一种速度较快的排序法

  • O(n²):一种速度较慢的排序法

  • O(n!): 是一种非常慢的算法

注意:


大O比较的是操作数,它指出了算法运行时间的增速,括号里的是操作数


主要理解


  • 用大O表示法表示算法的运行时间

  • 算法的速度指的是操作数的增速,而非时间

  • 谈论算法速度说的是随着输入数据的增加,其运行时间将以什么样的速度增加


哈哈哈哈哈为什么叫大O表示法,是因为操作数前有个大O。哈哈哈哈哈哈哈哈哈哈哈哈哈

相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
74 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
27 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
35 4
|
1月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
21 0
数据结构与算法学习十四:常用排序算法总结和对比
|
1月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
33 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
1月前
|
机器学习/深度学习 存储 算法
【数据结构与算法基础】——算法复杂度
【数据结构与算法基础】——算法复杂度
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
22 0
|
1月前
|
存储 算法 Java
数据结构和算法--分段树
数据结构和算法--分段树
17 0
|
1月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
14 0
下一篇
无影云桌面