算法、数据结构

算法、数据结构

理论基础

  • 数据结构

    • 栈,队列,链表,二叉树
  • 算法:
    • 选择,冒泡,二分查找,快速排序,希尔排序,插入排序,二叉树的排序,链表排序

什么是计算机科学?

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

如何形象化的理解算法

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

意义

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

什么是算法分析?

  • 刚接触编程的学生经常会将自己编写的程序和别人的程序做比对,获取在比对的过程中会发现双方编写的程序很相似但又各不相同。那么就会出现一个有趣的现象:两组程序都是用来解决同一个问题的,但是两组程序看起来又各不相同,那么哪一组程序更好呢?
  • a+b+c = 1000 a2 + b2 = c**2 (a,b,c均为自然数),求出a,b,c可能的组合?

方法1

for a in range(0,1001):
    for b in range(0,1001):
        for c in range(0,1001):
            if a+b+c == 1000 and a**2+b**2 == c**2:
                print(a,b,c)

方法2

for a in range(0,1001):
    for b in range(0,1001):
        c = 1000-a-b
        if a+b+c == 1000 and a**2+b**2 == c**2:
                print(a,b,c)
0 500 500
200 375 425
375 200 425
500 0 500

评判程序优劣的方法

  • 消耗计算机资源和执行效率(不推荐,无法直观)
  • 计算算法执行的耗时(适当推荐,因为会受机器和执行环境的影响)
  • 时间复杂度(推荐)

时间复杂度

  • 评判规则:量化算法执行的操作/执行步骤的数量
  • 最重要的项:时间复杂度表达式中最有意义的项
  • 大O记法:就是使用时间复杂度衡量算法好坏的表现形式。
    • O(最重要的项)
def sumOfN(n):
    theSum = 0 #1
    for i in range(1,n+1):
        theSum = theSum + i  	# n
    return theSum  				# 1

print(sumOfN(10))  # 55
# n+1+1 --> 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+3n**2+2n+1
# O(n**2)  # 取最重要的部分,省去数字,保留n;n的话保留最高影响力的
  • 常见的时间复杂度:

    • O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

数据结构

  • 概念:对于数据(基本类型的数据(int,float,char))的组织方式就被称作为数据结构。数据结构解决的就是一组数据如何进行保存,保存形式是怎样的。
  • 案例: 需要存储一些学生的学生信息(name,score),那么这些数据应该如何组织呢?查询某一个具体学生的时间复杂度是什么呢?(三种组织方式)

方法1

[{
    ‘name‘:‘xxx‘,
    ‘score‘:‘xxx‘
},{
    ‘name‘:‘xxx‘,
    ‘score‘:‘xxx‘
},{
    ‘name‘:‘xxx‘,
    ‘score‘:‘xxx‘
}]
# O(n)
[{‘name‘: ‘xxx‘, ‘score‘: ‘xxx‘},
 {‘name‘: ‘xxx‘, ‘score‘: ‘xxx‘},
 {‘name‘: ‘xxx‘, ‘score‘: ‘xxx‘}]

方法2

[
    (‘name‘,‘score‘),
    (‘name‘,‘score‘),
    (‘name‘,‘score‘)
]
# O(n)
[(‘name‘, ‘score‘), (‘name‘, ‘score‘), (‘name‘, ‘score‘)]

方法3

{
    ‘zhangsan‘:{‘score‘:‘xxx‘},
    ‘lisi‘:{‘score‘:‘xxx‘}
}
# O(1) dict在查询指定变量名方面明显优于list
{‘zhangsan‘: {‘score‘: ‘xxx‘}, ‘lisi‘: {‘score‘: ‘xxx‘}}
  • 三种组织形式基于查询的时间复杂度?
  • 使用不同的形式组织数据,在基于查询时的时间复杂度是不一样的。因此认为算法是为了解决实际问题而设计的,数据结构是算法需要处理问题的载体。

目标

  • 本节的目标是告诉大家Python列表和字典操作的 大O 性能。然后我们将做一些基于时间的实验来说明每个数据结构的花销和使用这些数据结构的好处

实操

  • 在列表的操作有一个非常常见的编程任务就是是增加一个列表。我们马上想到的有两种方法可以创建更长的列表,可以使用 append 方法或拼接运算符。但是这两种方法那种效率更高呢。这对你来说很重要,因为它可以帮助你通过选择合适的工具来提高你自己的程序的效率。
  • 实例化一个空列表,然后将0-n范围的数据添加到列表中。(四种方式)
  • timeit模块:该模块可以用来测试一段python代码的执行速度/时长。
  • Timer类:该类是timeit模块中专门用于测量python代码的执行速度/时长的。原型为:class timeit.Timer(stmt=‘pass‘,setup=‘pass‘)。
    • stmt参数:表示即将进行测试的代码块语句。
    • setup:运行代码块语句时所需要的设置。
    • timeit函数:timeit.Timer.timeit(number=100000),该函数返回代码块语句执行number次的平均耗时。
def test01():
    alist = []
    for i in range(1000):
        alist.append(i)
    return alist
def test02():
    alist = []
    for i in range(1000):
        alist = alist + [i]
    return alist
def test03():
    alist = [i for i in range(1000)]
    return alist
def test04():
    alist = list(range(1000))
    return alist
  • 四种方式中哪种方式添加列表元素的效率最高呢?

    • 计算运行平均耗时
from timeit import Timer

def test01():
    alist = []
    for i in range(1000):
        alist.append(i)
    return alist

def test02():
    alist = []
    for i in range(1000):
        alist = alist + [i]
    return alist

def test03():
    alist = [i for i in range(1000)]
    return alist

def test04():
    alist = list(range(1000))
    return alist

if __name__== ‘__main__‘:  # 这是.py文件写法
    timer1 = Timer(stmt=‘test01()‘,setup=‘from __main__ import test01‘)
    t1 = timer1.timeit(100) 

    timer2 = Timer(stmt=‘test02()‘,setup=‘from __main__ import test02‘)
    t2 = timer2.timeit(100)

    timer3 = Timer(stmt=‘test03()‘,setup=‘from __main__ import test03‘)
    t3 = timer3.timeit(100) 

    timer4 = Timer(stmt=‘test04()‘,setup=‘from __main__ import test04‘)
    t4 = timer4.timeit(100)

    print(t1,t2,t3,t4)  # 结果可以看出 t4 < t3 < t1 < t2,即t4效率最高
0.0057362 0.1003685 0.0023975999999999997 0.0010071999999999998
%%timeit  # 这是IPython特有的,jupyter notebook内置IPython
print(‘aaa‘)
# 结果中可以看出print()函数在当前条件(包括硬件)下的执行平均耗时为147 μs ± 26.5 μs
aaa
aaa
...
aaa
aaa
147 μs ± 26.5 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

原文地址:https://www.cnblogs.com/Guoxing-Z/p/12670239.html

时间: 2024-10-30 08:48:07

算法、数据结构的相关文章

从算法+数据结构到MVC

-------------------- Pascal之父--Nicklaus Wirth,提出了著名公式:"算法+数据结构=程序". Nicklaus Wirth,1934年出生于瑞士,1963年在加州大学伯克利分校取得博士学位.取得博士学位后直接被以高门槛著称的斯坦福大学聘到刚成立的计算机科学系工作.在斯坦福大学成功的开发出Algol W以及PL360后,Nicklaus Wirth于1967年回到祖国瑞士,第二年苏黎世工学院他创建与实现了Pascal语言--当时世界上最受欢迎的语

算法数据结构02 /常用数据结构

目录 2算法数据结构02 /常用数据结构 1. 栈 2. 队列 3. 双端队列 4. 内存相关 5. 顺序表 6. 链表 7. 二叉树 2算法数据结构02 /常用数据结构 1. 栈 特性:先进后出的数据结构,有栈顶和栈尾 应用场景:每个 web 浏览器都有一个返回按钮.浏览网页时,这些网页被放置在一个栈中(实际是网页的网址).现在查看的网页在顶部,第一个查看的网页在底部.如果按'返回'按钮,将按相反的顺序浏览刚才的页面. 栈的方法: Stack():创建一个空的新栈. 它不需要参数,并返回一个空

算法数据结构01 /算法数据结构概述

目录 算法数据结构01 /算法数据结构概述 1. 算法 2. 评判程序优劣的方法 3. 时间复杂度 4. 数据结构 5. python数据结构性能分析 6. 总结 算法数据结构01 /算法数据结构概述 1. 算法 算法概述 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务.一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用. 算法是独立存在的一种解决问题的方法和思想. 对于算法而言,实

算法数据结构面试分享(一)- 解决算法问题的一般方法

先看一道题目: 给你一个整型数组,我想找出来最大的两个数,能帮我写一个算法吗?     拿到这个题目,大家会怎么想到用什么方法解决吗?我见过很多同学的回答是,先排序,取最大的两个数就好了.那么接下来我们的问题就变成了如何给这个整型数组排序了.我们有很多种方法,冒泡排序,快速排序等等.很有可能面试官就让你开始写具体的排序算法了.当然,有些有经验的同学可能会说了,排序我直接调用sort方法就好了哈.  其实,这两种情况都没有对错之分,只是没有敲开面试官的心扉,也没有给人眼前一亮,让自己脱颖而出. 再

计数排序 - 算法数据结构面试分享(五)

数组排序问题 - 计数排序 昨天我们留了一道题目"给你一个整型数组,里面出现的数在[0-100] 之间,能用最优化的方法帮我排序吗". 1. 确保我们理解了问题,并且尝试一个例子,确认理解无误. 这是一道排序算法题,我们学过很多排序的算法.不一样的是,它给定一个额外的条件,数组里的每个数字都在1-100之间.如果我们采取传统的排序算法,这个条件我们好像用不上.大家在面试的时候如果发现有条件没有用上,基本上我们给出的算法可能不是最优的,或者我们没有解决它最原始的需求.举个例子{50, 4

算法数据结构面试分享(六)数组排序问题(2) - 计数排序

数组排序问题(2) 昨天我们留了一道题目"给你一个整型数组,里面出现的数在[0-100] 之间,能用最优化的方法帮我排序吗". 1. 确保我们理解了问题,并且尝试一个例子,确认理解无误. 这是一道排序算法题,我们学过很多排序的算法.不一样的是,它给定一个额外的条件,数组里的每个数字都在1-100之间.如果我们采取传统的排序算法,这个条件我们好像用不上.大家在面试的时候如果发现有条件没有用上,基本上我们给出的算法可能不是最优的,或者我们没有解决它最原始的需求.举个例子{50, 46, 5

【基本算置顶】各大算法&amp;&amp;数据结构模板

板子,全是板子 更新日志(从2018.11.19开始) 2018.12.02 : 更新了数据结构->扫描线 2018.11.22 : 更新了数据结构->平衡树->FHQ Treap->维护区间操作 2018.11.20 : 更新了数论->博弈论->nim游戏 2018.11.20 : 更新了数据结构->平衡树->FHQ Treap 观摩本蒟蒻板子库的大佬数: 不断更新 一.数论 1.快速幂 2.欧拉函数 3.乘法逆元(线性求逆) 4.线性筛素数 5.扩展欧几

算法数据结构中有哪些奇技淫巧?

之前我也写过一两篇与算法技巧相关的文章 一些常用的算法技巧总结 [算法技巧]位运算装逼指南 今天的这篇文章,算是一种补充,同时会列举一些常见的算法题,如何用这些技巧来解决,通过使用这些方法,可以让一些算法题变的更加简单. 1.用 n & (n - 1)消去 n 最后的一位 1 在 n 的二进制表示中,如果我们对 n 执行 n = n & (n - 1) 那么可以把 n 左右边的 1 消除掉,例如 n = 1001 n - 1 = 1000 n = n & (n - 1) = (10

介绍:算法+数据结构

什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已.所谓的计算机科学实际上是对问题.解决问题以及解决问题的过程中产生产生的解决方案的研究.例如给定一个问题,计算机科学家的目标是开发一个算法来处理该问题,最终得到该问题的解.或者最优解.所以说计算机科学也可以被认为是对算法的研究. 算法就是对问题进行处理且求解的一种实现思路或者思想. 如何形象化的理解算法 一个常胜将军在作战之前都会进行战略

【算法数据结构Java实现】时间复杂度为O(n)的最大和序列

1.背景 最大序列和问题一直以来是一个比较经典的算法题,看到这个问题,有很多解题的办法.今天看到了一种时间复杂度只为O(n)的解题算法,在这里记录下. 思路很简单,比方说有P1,P2,P3,P4.....这样一个序列,我们从P1开始求和,比如说在P5时求和数小于零,就可以断定.第一种情况,最大序列在P1~P5之间,或者说在P6~Pn之间.因为如果P1+P2+......+P5的和小于零,那么它可以看成一个数,而且是序列第一个数,则任何一个最大序列都不会包含这个数. 2.代码实现 package