zoukankan      html  css  js  c++  java
  • 对算法的初步认知与数据结构

    1.什么是计算机科学?

      首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已。所谓的计算机科学实际上是对问题、解决问题以及解决问题的过程中产生产生的解决方案的研究。例如给定一个问题,计算机科学家的目标是开发一个算法来处理该问题,最终得到该问题的解、或者最优解。所以说计算机科学也可以被认为是对算法的研究。因此我们也可以感受到,所谓的算法就是对问题进行处理且求解的一种实现思路或者思想。

    2.如何形象化的理解算法?

       一个常胜将军在作战之前都会进行战略的制定,目的是为了能够在最短的时间切成本消耗最低的情况下获取最终的胜利。如果将编码作为战场,则程序员就是这场战役的指挥官,你如何可以将你的程序可以在最短且消耗资源最小的情况下获取最终的执行结果呢?算法就是我们的策略!

    3.学习算法的意义?

    • 数据结构和算法思想的通用性异常的强大,在任何语言中都被使用,它们将会是我们编码生涯中伴随我们最长久利器(左膀右臂)。有一定经验的程序员最终拼的就是算法和数据结构。
    • 数据结构和算法思想也可以帮助我们拓展和历练编码的思维,可以让我们更好的融入到编程世界的角角落落。

    4.什么是算法分析?

      刚接触编程的学生经常会将自己编写的程序和别人的程序做比对,获取在比对的过程中会发现双方编写的程序很相似但又各不相同。那么就会出现一个有趣的现象:两组程序都是用来解决同一个问题的,但是两组程序看起来又各不相同,那么哪一组程序更好呢?这时就用到算法分析,来计算那组程序更优。

    a+b+c = 1000 a2 + b2 = c**2 (a,b,c均为自然数),求出a,b,c可能的组合?
    方式一;
    for a in range(1001): for b in range(1001): for c in range(1001): if a + b + c == 1000 and a**2 + b**2 == c**2: print(a, b, c) 方式二: for a in range(1001): for b in range(1001): c = 1000 - a - b if a + b + c == 1000 and a**2 + b**2 == c**2: print(a, b, c)

    5.评判程序优劣的方法1

      1.消耗计算机资源的和执行效率(无法直观的展示)。

      2.计算算法执行的耗时(不推荐,因为会收机器和执行环境的影响,测试数据不准备)。

    import time
    start_time = time.time()
    for a in range(1001):
    for b in range(1001):
    for c in range(1001):
    if a + b + c == 1000 and a**2 + b**2 == c**2:
    print(a, b, c)
    print(time.time() - start_time)

    # 执行结果为:
    0 500 500
    200 375 425
    375 200 425
    500 0 500
    145.82734084129333
    import time
    start_time = time.time()
    for a in range(1001):
        for b in range(1001):
            c = 1000 - a - b
            if a + b + c == 1000 and a**2 + b**2 == c**2:
                print(a, b, c)
    
    print(time.time() - start_time)
    执行结果为:
    0 500 500
    200 375 425
    375 200 425
    500 0 500
    1.813103437423706

      3.时间复杂度,量化算法需要的操作或者执行步骤的数量。

    6.时间复杂度

    • 评判规则:量化算法执行的操作/执行步骤的数量。
    • 最重要的项:时间复杂度表达式中最有意义的项
    • 使用大O记法表示时间复杂度
    •  常见的时间复杂度:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)  < O(n!) < O(n^n)
    • 案例分析:计算下列算法的时间复杂度
       
      a=5
      b=6
      c=10
      for i in range(n):
         for j in range(n):
            x = i * i
            y = j * j
            z = i * j
      for k in range(n):
         w = a*k + 45
         v = b*b
      d = 33

      分析:前三行赋值语句执行操作步骤为3,5-8行的执行操作步骤为3n,结合第四行的外部循环,整个内外循环的执行步骤为3n^2。9-11行为2n,12行为1。最终得出T(n)=3+3n^2+2n+1,简化操作后T(n)=3n^2+2n+4。通过查看指数,我们可以看到 n^2 项是最重要的,因此这个代码段是 O(n^ 2)。当 n 增大时,所有其他项以及主项上的系数都可以忽略。

    7.数据结构

     - 对于数据(基本类型的数据(int,float,chat))组织方式就别称为数据结构。数据结构解决的就是一组数据如何进行保存,保存形式是怎样的。

     - 案例: 需要存储一些学生的学生信息(name,score),那么这些数据应该如何组织呢?查询某一个具体学生的时间复杂度是什么呢?(三种组织方式)

        - 组织方式一

    [{
        'name':'xxx',
        'score':'xxx'
    },{
        'name':'xxx',
        'score':'xxx'
    },{
        'name':'xxx',
        'score':'xxx'
    }]

      - 组织方式二

    [
        ('name','score'),
        ('name','score'),
        ('name','score')
    ]

      - 组织方式三

    {
        'zhangsan':{'score':'xxx'},
        'lisi':{'score':'xxx'}
    }
    • 三种组织形式基于查询的时间复杂度?
    • 使用不同的形式组织数据,在基于查询时的时间复杂度是不一样的。因此认为算法是为了解决实际问题而设计的,数据结构是算法需要处理问题的载体。
  • 相关阅读:
    关于 JLRoutes
    关于Objection 框架或解耦合方案
    窥探 NSObject
    关于cocoa 运行时runtime
    关于 cocoapods 使用
    关于Xcode 遇到的 警告、错误 处理
    ios 中正则匹配 ,NSPredicate
    关于状态栏 上颜色配置 ios7.x 之后
    使用ios系统侧滑 7.x 之后
    常用的shell脚本
  • 原文地址:https://www.cnblogs.com/zangyue/p/12022985.html
Copyright © 2011-2022 走看看