算法与数据结构(一)

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

目录


二分查找


运行时间


大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。哈哈哈哈哈哈哈哈哈哈哈哈哈

相关文章
|
12天前
|
机器学习/深度学习 算法 存储
[数据结构]——算法的时间复杂度和空间复杂度
[数据结构]——算法的时间复杂度和空间复杂度
|
19天前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
39 0
|
5天前
|
算法
重拾数据结构和算法——脑图
重拾数据结构和算法——脑图
11 0
|
10天前
|
算法 搜索推荐 Java
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
7 0
|
11天前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
11 1
C语言数据结构算法,常用10种排序实战
|
17天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
19天前
|
机器学习/深度学习 算法 数据可视化
Python 数据结构和算法实用指南(四)(4)
Python 数据结构和算法实用指南(四)
28 1
|
19天前
|
机器学习/深度学习 存储 算法
Python 数据结构和算法实用指南(四)(3)
Python 数据结构和算法实用指南(四)
17 1
|
19天前
|
存储 算法 搜索推荐
Python 数据结构和算法实用指南(四)(2)
Python 数据结构和算法实用指南(四)
12 0
|
19天前
|
存储 算法 Serverless
Python 数据结构和算法实用指南(四)(1)
Python 数据结构和算法实用指南(四)
17 0