zoukankan      html  css  js  c++  java
  • 1算法简介

    1.1 引言

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

    1.2 二分查找

    使用二分查找时,每次都排除一半的数字。对于包含n个元素的列表,使用二分查找最多需要log2N步,而简单查找最多需要n步.

    查找方法简单查找二分查找
    假设列表包含1024个元素,查找某个元素最多查找1024次最多查找8次。
    log21024=8
    幂运算和对数元算:对数运算是幂运算的逆运算。 幂运算:将x个a相乘的结果,求N。 N=ax 对数运算:多少个a相乘等于N,求x。 x=logaN 说明:仅当列表是有序的时候,二分查找才管用。 ### 1.2.1 示例代码 ```#python def binarySearch(list,item): """list为一个有序数组,item为查找的元素""" low = 0 high = len(list)-1 while(low<=high): mid = (int)((low+high)/2) guess = list[mid] # print(mid) if(guess == item): #猜中了 return mid if(guess > item): #猜的数字大了,从[low, mid-1]重新查找 high = mid -1 if(guess < item): #猜的数字小了,从[mid+1, high]重新查找 low = mid + 1 return None list1=[1,2,3,4,5,6] list2=[1,3,5,7,9] print(binarySearch(list1,1)) #0 print(binarySearch(list2,-3)) #None ```

    1.2.2 运行时间

    一般而言,应选择效率最高的算法,以最大限度的减少运行时间或占用空间。
    线性时间:猜测的最多次数与列表长度相同。
    对数时间:二分查找的运行时间为对数时间
    假设列表包含1024个元素,查找某个元素

    查找方法查找次数运行时间
    简单查找最多查找1024次1024
    二分查找最多查找8次。
    log21024=8
    8

    1.3 大O表示法

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

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

    假设查找一个元素用时1毫秒,查看不同长度的数组使用简单查找和二分查找运行时间

    查找方法100个元素1万个元素(与100相比)1千万个元素(与100相比)10亿个元素(与100相比)
    简单查找100毫秒10000毫秒(100倍)1000万毫秒(10万倍)10亿毫秒(1000万倍)
    二分查找 714(用时2倍)24(用时3倍多)30(用时4倍多)
    从表中可以看出,随着元素数量的增加,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。因此随着列表的增长,二分查找的速度比简单查找快得多。 因此仅知道算法需要多长时间才能执行完毕还不够,还需知道运行时间如何随列表增长而增加。 大O表示发指出了算法有多快。查找一个列表,简单查找用时O(n),二分查找用时O(log2n)

    1.3.2 理解不同的大O运行时间

    在一张纸上绘制16个格子。
    方法1:1次画一个格子,需要16步。运行时间O(n)
    方法2:将纸横向对折,再对折;摊平,纵向对折,再对折,需要4步,运行时间O(log2n)

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

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

    • O(log n):对数时间,这样的算法包括二分查找
    • O(n):线性时间,这样的算法包括简单查找
    • O(n*long n):这样的算法包括快速排序——一种速度较快的排序算法
    • O(n2):这样的算法包括选择排序——一种速度较慢的排序算法
    • O(n!):这样的算法包括旅行商问题的解决方案——一种非常慢的算法

    启示:

    • 算法的速度指的并非时间,而是操作数的增速
    • 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
    • 算法的运行时间用大O表示发表示
    • o(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快的越多

    1.3.4 旅行商

    有一位旅行商,他需要前往5个城市,同时确保旅程最短。
    对于每种顺序,他都计算总旅程,在挑选出旅程最短的路线。

    • 5个城市有120种不同的排列方式。
    • 6个城市有720种不同的排列方式。
    • 7个城市有5040种不同的排列方式。

    推而广之,设计n个城市时,需要执行n!(n的阶乘)次操作才能计算出结果。因此运行时间为O(n!),即阶乘时间。这是计算机科学领域待解决的问题,对于这个问题,目前还没有找到更快的算法。

    1.4 小结

    • 二分查找的速度比简单查找快得多。
    • o(log n)比O(n)快。需要搜索的元素越多,前者比后者就快的越多。
    • 算法运行时间并不以秒为单位。
    • 算法运行时间是从其增速的角度度量的。
    • 算法运行时间用大O表示法表示。
  • 相关阅读:
    [1.2]由UML模型通过XMI生成XML,通过XSLT展示到表现层
    [1.1]XMI 与UML结合开发企业应用中业务模型
    如何创建脱机数据库应用程序思路
    SAML在无线网络传输的应用[对照文]
    SoberGGG对针式PKM的初次测评
    [转]美国知名天使投资人列出愿意投资的30大创意方向
    针式PKM适合哪些用户使用?
    没有个人知识管理就是觉得学了很多,却不得记到底学到了什么。
    [转]人之患在好为人师
    [转]一位中国的黑客的一封信!
  • 原文地址:https://www.cnblogs.com/csj2018/p/12042169.html
Copyright © 2011-2022 走看看