算法分类 ,时间复杂度 ,空间复杂度,优化算法

算法

    今天给大家带来一篇关于算法排序的分类,算法的时间复杂度,空间复杂度,还有怎么去优化算法的文章,喜欢的话,可以关注,有什么问题,可以评论区提问,可以与我私信,有什么好的意见,欢迎提出.

前言: 算法的复杂度分为时间复杂度与空间复杂度,时间复杂度指执行算法需要需要的计算工作量,空间复杂度值执行算法需要的内存量,可能在运行一些小数据的时候,大家体会不到算法的时间与空间带来的体验. 优化算法就是将算法的时间优化到最快,将空间优化到最小,假如你写的mod能够将百度游览器的搜索时间提升0.5秒,那都是特别厉害的成绩.

本章内容:   1,算法有哪些   2,时间复杂度,空间复杂度   3,优化算法   4,算法实例

一,算法有哪些

  常见的算法有冒泡排序,快排,归并,希尔,插入,二分法,选择排序,广度优先搜索,贪婪算法,这些都是新手入门必须要了解的,你可以不会,但是你必须要知道他是怎么做到的,原理是什么,今天就给大家讲一讲我们常用的冒泡排序,选择排序,这两个排序算法,

1,冒泡排序(Bubble Sort), 为什么叫他冒泡排序呢? 因为他就像是从海底往海面升起的气泡一样,从小到大,将要排序的数从小到大排序,

冒泡的原理: 他会一次比较两个数字,如果他们的顺序错误,就将其调换位置,如果排序正确的话,就比较下一个,然后重复的进行,直到比较完毕,

这个算法的名字也是这样由来的,越大的数字,就会慢慢的‘浮‘到最顶端. 好了该上代码了,下面就是冒泡排序的代码,冒泡相对于其他的排序算法来说,比较的简单,比较好理解,运算起来也是比较迅速的,比较稳定,在工作中也会经常用到,推荐使用

# 冒泡排序
def bubble_sort(alist):
    n = len(alist)
    # 循环遍历,找到当前列表中最大的数值
    for i in range(n-1):
        # 遍历无序序列
        for j in range(n-1-i):
            # 判断当前节点是否大于后续节点,如果大于后续节点则对调
            if alist[j] > alist[j+1]:
                alist[j], alist[j+1] = alist[j+1], alist[j]
if __name__ == ‘__main__‘:
    alist = [12,34,21,56,78,90,87,65,43,21]
    bubble_sort(alist)
    print(alist)
# 最坏时间复杂度: O(n^2)
# 最优时间复杂度: O(n)
# # 算法稳定性:稳定

  

2,选择排序(selection sort)

    选择排序(selection sort)是一种简单直观的排序方法, 他的原理是在要排序的数列中找到最 大 或者最 小 的 元素,放在列表的起始位置,然后从其他里找到第二大,然后第三大,依次排序,

依次类,直到排完,

    选择排序的优点是数据移动, 在排序中,每个元素交换时,至少有一个元素移动,因此N个元素进行排序,就会移动 1--N 次,在所有依靠移动元素来排序的算法中,选择排序是比较优秀的一种

选择排序时间复杂度与稳定性:

最优时间复杂度: O(n2)

最坏时间复杂度:O(n2)

算法稳定性 :不稳定(考虑每次升序选择最大的时候)

#             if alist[j] < alist[min_index]:
#                 min_index = j
#
#         # 判断min_index索引是否相同,不相同,做数值交换
#         if i != min_index:
#             alist[i],alist[min_index] = alist[min_index],alist[i]
#
#
# if __name__ == ‘__main__‘:
#     alist = [12,34,56,78,90,87,65,43,21]
#     # alist = [1,2,3,4,5,6,7,8,9]
#     select_sort(alist)
#     print(alist)

# O(n^2)
# 不稳定

def select_sort(alist):
    """选择排序"""
    n = len(alist)
    for i in range(n - 1):
        min_index = i  # 最小值位置索引、下标
        for j in range(i+1, n):
            if  alist[j] < alist[min_index]:
                min_index = j
        # 判断min_index ,如果和初始值不相同,作数值交换
        if min_index != i:
            alist[i], alist[min_index] = alist[min_index],alist[i]

if __name__ == ‘__main__‘:
    alist = [8,10,15,30,25,90,66,2,999]
    select_sort(alist)
    print(alist)

这是一些算法的时间复杂度与稳定性

    

时间复杂度,空间复杂度

    接下来就要来说说时间复杂度与空间复杂度: 时间复杂度就是假如你 泡茶,从开始泡,到你喝完茶,一共用了多长时间,你中间要执行很多步骤,取茶叶,烧水,上厕所,接电话,这些都是要花时间的,

在算法中,时间复杂度分为  O(1)最快 , O(nn)最慢,

O(1) < O(logn) <O(n)<O(n2)<O(n3)<O(2n) <O(nn)    一般游览器的速度都在O(n),做我们这一行,要注意客户体验,如果你程序的运行特别慢,估计别人来一次,以后再也不会来了

下面给大家找了张如何计算 时间复杂度的图片:

    空间复杂度(space complexity) ,执行时所需要占的储存空间,记做 s(n)=O(f(n)),其中n是为算法的大小, 空间复杂度 绝对是效率的杀手,曾经看过一遍用插入算法的代码,来解释空间复杂度的,

觉得特别厉害,我就比较low了,只能给大家简单的总结一下我遇到的空间复杂度了,

  一般来说,算法的空间复杂度值得是辅助空间,比如:一组数字,时间复杂度O(n),二维数组a[n][m]   :那么他的空间复杂度就是O(n*m)     ,因为变量的内存是自动分配的,第一个的定义是循环里面的,所以是n*O(1)   ,如果第二个循环在外边,那么就是1*O(1)     ,这里也只是一个了解性的东西,如果你的工作中很少用到,那么没有必要深究,因为用的真的很少

优化算法

这边带来了代码,你们在复制下来了python上运行一下,看一下用的时间与不同, 自然就懂了,

这是未优化的算法

‘‘
已知有a,b,c三个数,都是0-1000之内的数,
且: a+b+c=1000 而且 a**2+b**2=c**2  ,求a,b,c一共有多少种组合
‘‘‘
# 在这里加一个时间模块,待会好计算出结果
import time
# 记录开头时间
start_time=time.time()
# 把a,b,c循环出来
for  a in range(1001):
    for b in range(1001):
        for c in range(100):
            #  判断他  主公式  第一次,并未优化
            if a+b+c==1000 and a**2 + b**2 == c**2 :
                # 打印
                print("a=" ,a)
                print("b=" ,b)
                print("c=" ,c)
            else:
                pass
stop_time = time.time()
print(‘一共耗时: %f‘%(stop_time-start_time))
# 一共耗时 156.875001秒

这是第一次优化

import time
# 记录开头时间
start_time=time.time()
# 把a,b,c循环出来
for  a in range(1001):
    # 这里改成1001-a之后,他就不用再循环b了
    for b in range(1001-a):
        for c in range(100):
            #  判断他  主公式  第二次,优化了b,
            if a+b+c==1000 and a**2 + b**2 == c**2 :
                print("a=" ,a)
                print("b=" ,b)
                print("c=" ,c)
            else:
                pass
stop_time = time.time()
print(‘一共耗时: %f‘%(stop_time-start_time))
# 一共耗时 50.557070秒

最后一次优化

import time
# 记录开头时间
start_time=time.time()
# 把a,b,c循环出来
for  a in range(1001):
    for b in range(1001-a):
            c=1000 - a - b
            #  判断他  主公式  第三次,优化了b和c
            if a+b+c==1000 and a**2 + b**2 == c**2 :
                print("a=" ,a)
                print("b=" ,b)
                print("c=" ,c)
            else:
                pass
stop_time = time.time()
print(‘一共耗时: %f‘%(stop_time-start_time))
# 一共耗时 2.551449秒

从156秒优化到l2秒,    基本运算总数 * 基本运算耗时  = 运算时间    这之间的耗时和你的机器有着很大的关系

今天是12月30日,明天就要跨年了,祝大家2019年事业有成,工资直线上升,早日脱单,

原文地址:https://www.cnblogs.com/lowbi/p/10164308.html

时间: 2024-07-29 05:52:47

算法分类 ,时间复杂度 ,空间复杂度,优化算法的相关文章

P103 Dijkstra算法 单源最短路问题优化算法

///标准的dijkstra算法 void dijkstra() { while(true) { int vert=-1; dis[-1]=INF; for(int i=0;i<num_v;i++) { if( (!used[i]) && ( vert==-1||dis[i]<dis[vert] ) ) {vert=i;} } if(vert==-1) break;///这里要提前break;好像是这样... used[vert]=1; for(int i=0;i<num

算法之时间复杂度和空间复杂度

时间复杂度: 定义:在进行算法分析时,语句的总执行次数T(n)是关于问题的规模n的函数,进而分析T(n)随着n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间时间量度,记做:T(n)=O(f(n)).它表示随着问题的规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度.其中f(n)是问题规模n的某个函数. 这样用大写 O()来体现算法时间复杂度的记法,我们称之为大 0 记法 .一般情况下,随着 n 的增大, T(n)增长最慢的算法

常用最短路优化算法及例题(附模板)——-SPFA和Dijkstra

常用最短路算法——-SPFA和Dijkstra及其优化 这篇文章将简单讲解两个最常用的最短路优化算法,需要读者有一定的图论基础. 首先从DIJKSTRA讲起.常规的dijkstra算法复杂度较高,为O(n^2),因为要花大量时间来找当前已知的距顶点距离最小的值,所以用优先队列(值小的先出队列)来优化,可大大优化时间复杂度.STL中优先队列的操作单次复杂度为O(logN),所以经过优先队列优化的dijkstra时间复杂度会降到O(N*logN); 以下为核心部分代码: 1 struct pack{

[Machine Learning] 机器学习常见算法分类汇总

声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.本文为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的分类. 博主根据原创基础上加入了遗

优化算法 - 特点

Optimizer 1.选择哪种优化算法并没有达成共识 2.具有自适应学习率(以RMSProp 和AdaDelta 为代表)的算法族表现得相当鲁棒,不分伯仲,但没有哪个算法能脱颖而出. 3.对于当前流行的优化算法包括括SGD.具动量的SGD.RMSProp.具动量的RMSProp.AdaDelta 和Adam而言,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数) 4.基本不用二阶近似优化算法 -SGD SGD实际就是min-batch的实现,为最基础的优化算法,当今大部分优化

JS排序算法总结:八种算法对比

目的:掌握 排序算法的分类及不同算法复杂度的对比.搞清楚 XXX与数组初始状态无关分为几种情况: a.算法复杂度与初始状态无关: b.元素总比较次数与初始状态无关: c.元素总移动次数与初始状态无关. 1.算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间

算法——字符串匹配之KMP算法

前言 本节介绍Knuth-Morris-Pratt字符串匹配算法(简称KMP算法).该算法最主要是构造出模式串pat的前缀和后缀的最大相同字符串长度数组next,和前面介绍的<朴素字符串匹配算法>不同,朴素算法是当遇到不匹配字符时,向后移动一位继续匹配,而KMP算法是当遇到不匹配字符时,不是简单的向后移一位字符,而是根据前面已匹配的字符数和模式串前缀和后缀的最大相同字符串长度数组next的元素来确定向后移动的位数,所以KMP算法的时间复杂度比朴素算法的要少,并且是线性时间复杂度,即预处理时间复

算法的时间复杂度和空间复杂度

<算法的时间复杂度和空间复杂度合称为算法的复杂度> --->算法的时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度.记为T(n). (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模

数据结构和算法之时间复杂度和空间复杂度

前言 上一篇<数据结构和算法>中我介绍了数据结构的基本概念,也介绍了数据结构一般可以分为逻辑结构和物理结构.逻辑结构分为集合结构.线性结构.树形结构和图形结构.物理结构分为顺序存储结构和链式存储结构.并且也介绍了这些结构的特点.然后,又介绍了算法的概念和算法的5个基本特性,分别是输入.输出.有穷性.确定性和可行性.最后说阐述了一个好的算法需要遵守正确性.可读性.健壮性.时间效率高和存储量低.其实,实现效率和存储量就是时间复杂度和空间复杂度.本篇我们就围绕这两个"复杂度"展开