当前位置: 首页 > news >正文

算法的基本概念

1. 算法概念

algorithm:一个计算过程,解决问题的方法
程序设计=数据结构+算法
输入→算法→输出
数据结构就是关系

2. 时间复杂度

用来估计算法运行时间的一个式子,一般来说时间复杂度高的算法比复杂度低的算法慢

2.1 一些例子:

print('hello')   # O1  无循环

for i in range(n):  # O(n)  一层循环
    print('hello')

for i in range(n):  # O(n2)  2层循环
    for j in range(n):
        print('hello')

while n > 1:  # O(logn)  每次循环减半
    print(n)
    n = n//2

2.2 时间复杂度排序

1476661-20190422143633704-699803209.png

2.3 快速判断算法复杂度

  • 确定问题规模n
  • 是否循环减半→logn
  • k层关于n的循环→n^k

3. 空间复杂度

用来评估算法内存占用大小的式子

  • 算法使用了几个变量:O(1)
  • 算法使用了长度为n的一维列表:O(n)
  • 算法使用了m行n列的二维列表:O(mn)
    可以用空间换时间

4. 递归

递归的两个特点

  • 调用自身
  • 结束条件
def func1(x):
    if x > 0:
        print(x)
        func1(x - 1)
# 3 2 1
def func2(x):
    if x > 0:
        func2(x - 1)
        print(x)
# 1 2 3

对上述结果的解释

  1. func1的执行顺序,窄的表示打印,宽的表示函数
    1476661-20190422144704431-1941801767.png
    先打印在调用自身,从上到下执行下来
  2. func2的执行顺序,窄的表示打印,宽的表示函数
    1476661-20190422144838632-237051608.png
    函数还是从上往下执行,每一层都是先递归后打印,先打印的是最里面那层递归

5. 汉诺塔问题

5.1 问题分析

  1. n=2时
    • 小圆盘从A移动到B
    • 大圆盘从A移动到C
    • 小圆盘从B移动到C
  2. n时候,上面n-1个盘子看成一个整体
    • 把n-1个盘子从A经过C移动到B
    • 把n个盘子从A移动到C
    • 把n-1个盘子从B经过A移动到C
def hanoi(n, a, b, c):
    '''
    一共n层,盘子从a经过b移动到c
    '''
    if n > 0:
        hanoi(n - 1, a, c, b)
        print('moving from %s to %s' % (a, c))
        hanoi(n - 1, b, a, c)

hanoi(3,'A','B','C')
'''
moving from A to C
moving from A to B
moving from C to B
moving from A to C
moving from B to A
moving from B to C
moving from A to C
'''

转载于:https://www.cnblogs.com/qiuyicheng/p/10749958.html

相关文章:

  • 基于GPS数据建立隐式马尔可夫模型预测目的地
  • 转载 线程池之ThreadPool类与辅助线程 - 第二篇
  • 常见异常
  • 供应大型热水工程
  • 程序员为什么要高薪?看完让你勇于为自己开价
  • 更换XPE开关机画面和欢迎界面的方法
  • YUM安装调试以及命令具体解释
  • 深入理解alias, alias_method和alias_method_chain
  • golang包管理工具glide安装
  • 为寻求新增长点 山寨之父MTK发力Android
  • Use SourceLink enables a great source debugging experience
  • 【书籍推荐】Expert Oracle Practices
  • CodeForces-4C Registration system
  • 利用浏览器的搜索框作更多的事情
  • 键盘提示
  • 【Leetcode】101. 对称二叉树
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • ERLANG 网工修炼笔记 ---- UDP
  • input实现文字超出省略号功能
  • Iterator 和 for...of 循环
  • JS数组方法汇总
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • nodejs:开发并发布一个nodejs包
  • Python打包系统简单入门
  • Python实现BT种子转化为磁力链接【实战】
  • React组件设计模式(一)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 机器学习学习笔记一
  • 如何选择开源的机器学习框架?
  • 用element的upload组件实现多图片上传和压缩
  • 在weex里面使用chart图表
  • ​520就是要宠粉,你的心头书我买单
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​如何防止网络攻击?
  • ​什么是bug?bug的源头在哪里?
  • (+4)2.2UML建模图
  • (BFS)hdoj2377-Bus Pass
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm高校实验室 毕业设计 800008
  • (七)Knockout 创建自定义绑定
  • (强烈推荐)移动端音视频从零到上手(上)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (算法设计与分析)第一章算法概述-习题
  • (转)fock函数详解
  • (转)德国人的记事本
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET CF命令行调试器MDbg入门(一)
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 反编译_.net反编译的相关问题
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化