算法与数据结构(一)

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

目录


二分查找


运行时间


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

相关文章
|
6月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
185 1
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
617 1
|
6月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
183 0
|
10月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
330 10
 算法系列之数据结构-二叉树
|
10月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
312 3
 算法系列之数据结构-Huffman树
|
10月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
435 22
|
11月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
412 30
|
11月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
542 25
|
11月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
706 23
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
233 20

热门文章

最新文章