算法漫游指北(第二篇):安装配置vscode与python使用环境、计算复杂性与算法、时间复杂度与空间复杂度、数据结构

一、安装配置vscode与python使用环境

下载地址:官网https://code.visualstudio.com/

安装vscode:

一路next安装

配置VScode

安装python插件。

1、打开VScode,按下快捷键Ctrl+Shift+X,进入插件管理页面。

2、在搜索栏输入python。

3、选择插件,点击安装

安装代码自动补全与智能提示 Intelli

1、下载 Visual Studio IntelliCode 插件 在VSCode 的 Extensions 中搜索 IntelliCode,选择 Visual Studio IntelliCode 并 install

 

2、安装 微软Python语言服务 第一步执行完后,当进行编码时,VSCode会自动提醒你安装 微软Python语言服务(不安装的话,每次打开vscode都会提醒你安装,槽点满满),点击 Enable it and Reload Window 按钮,接下来就是比较的等待,安装期间完全可以进行其他工作:

创建项目,配置工作区域

1、创建一个本地文件夹,作为项目文件。

2、编写python文件

新建一个python文件,输入一句

print("Hello VScode")

按F5选择python file执行文件。

 

使用vscode安装LeetCode插件刷题

首先需要安装的是 Node.JS,因为 LeetCode 插件依赖 Node.JS。

nodejs安装见nodejs(第一篇)

 

1、快捷键Ctrl+Shift+X,安装leetcode插件

 

2、点击【LeetCode】图标,然后点击登录 LeetCode 账户。

 

3、选择登陆英文站还是中文站,然后选择sign in to leetcode

 

4、登陆成功,可以愉快的刷题了

 

一些VS Code 基本使用技巧整理

https://www.jianshu.com/p/61db92e209e1

二、计算复杂性与算法

计算复杂性

基于有穷观点的能行方法”的“可计算概念“仅仅涉及到问题的解决是否能在有限资源内(时 间/空间)完成,并不关心具体要花费多少计算步骤或多少存储空间。

人们发现各种不同的可计算问题,其难易程度是不一样的。有些问题非常容易解决,如基本数值计算; 有些问题的解决程度尚能令人满意,如表达式求值、排序等;有些问题的解决会爆炸性地吞噬资源,虽有解法 ,但没什么可行性,如哈密顿回路、货郎担问题。

 

计算复杂性与算法

计算复杂性理论研究问题的本质,将各种问题按照其难易程度分类,研究各类问题的难度级别,并不关心解决问题的具体方案。

而算法则研究问题在不同现实资源约束情况下的不同解决方案,致力于找到效率最高的方案。 不同硬件配置(手持设备、PC设备、超级计算机) 不同运行环境(单机、多机环境、网络环境、小内存) 不同应用领域(消费、工业控制、医疗系统、航天领域) 甚至不同使用状况(正常状况、省电状况)。

算法分析的概念

算法分析主要是比较程序的“好坏”,有更多因素:代码风格、可读性等等。我们主要感兴趣的是算法本身特性。 算法分析主要就是从计算资源消耗的角度来评判和比较算法,更高效利用计算资源,或者更少占用计算资源的算法,就是好算法。

 

算法分析计算资源指标

一种是算法解决问题过程中需要的存储空间或内存,但存储空间受到问题自身数据规模的变化影响。 要区分哪些存储空间是问题本身描述所需,哪些是算法占用。 另一种是算法的执行时间,我们可以对程序进行实际运行测试,获得真实的运行时间。

 

三、算法的时间复杂度与空间复杂度

一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

  • 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。

  • 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。

大 O 复杂度表示法

我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。算然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率。

对于算法的时间效率,我们可以用“大O记法”来表示。

 

 

最坏时间复杂度

分析算法时,存在几种可能的考虑:

  • 算法完成工作最少需要多少基本操作,即最优时间复杂度

  • 算法完成工作最多需要多少基本操作,即最坏时间复杂度

  • 算法完成工作平均需要多少基本操作,即平均时间复杂度

对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息,其反映的只是最乐观最理想的情况,没有参考价值。

对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作。

对于平均时间复杂度,是对算法的一个全面评价,因此它完整全面的反映了这个算法的性质。但另一方面,这种衡量并没有保证,不是每个计算都能在这个基本操作内完成。而且,对于平均情况的计算,也会因为应用算法的实例分布可能并不均匀而难以计算。

因此,我们主要关注算法的最坏情况,亦即最坏时间复杂度。

 

时间复杂度的几条基本计算规则

  1. 基本操作,即只有常数项,认为其时间复杂度为O(1)

  2. 顺序结构,时间复杂度按加法进行计算

  3. 循环结构,时间复杂度按乘法进行计算

  4. 分支结构,时间复杂度取最大值

  5. 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略

  6. 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度

快速判断时间复杂度技巧

  • 确定问题规模n

  • 循环减半过程 --logn

  • k层关于n的循环--n^k

 

常见的时间复杂度

常见的时间复杂度高低排序:

图示

 

数据结构时间复杂度

python中时间复杂度常见示例

print('Hello world')  # O(1)
 
 
# O(1)
print('Hello World')
print('Hello Python')
print('Hello Algorithm')
 
 
for i in range(n):  # O(n)
    print('Hello world')
 
 
for i in range(n):  # O(n^2)
    for j in range(n):
        print('Hello world')
 
 
for i in range(n):  # O(n^2)
    print('Hello World')
    for j in range(n):
        print('Hello World')
 
 
for i in range(n):  # O(n^2)
    for j in range(i):
        print('Hello World')
 
 
for i in range(n):
    for j in range(n):
        for k in range(n):
            print('Hello World')  # O(n^3)

  

几次循环就是n的几次方的时间复杂度。

n = 64
while n > 1:
    print(n)
    n = n // 2

  

26 = 64,log264 = 6,所以循环减半的时间复杂度为O(log2n),即O(logn)

如果是循环减半的过程,时间复杂度为O(logn)或O(log2n)

 

空间复杂度

空间复杂度:用来评估算法内存占用大小的一个式子

a = 'Python'  # 空间复杂度为1
 
 
# 空间复杂度为1
a = 'Python'
b = 'PHP'
c = 'Java'
 
 
num = [1, 2, 3, 4, 5]  # 空间复杂度为5
 
 
num = [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]  # 空间复杂度为5*4
 
 
num = [[[1, 2], [1, 2]], [[1, 2], [1, 2]] , [[1, 2], [1, 2]]]  # 空间复杂度为3*2*2

  

定义一个或多个变量,空间复杂度都是为1,列表的空间复杂度为列表的长度。

 

list内置操作的时间复杂度

dict内置操作的时间复杂度

 

四、数据结构

概念

数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。数据结构指数据对象中数据元素之间的关系。

Python给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做Python的内置数据结构,比如列表、元组、字典。而有些数据组织方式,Python系统里面没有直接定义,需要我们自己去定义实现这些数据的组织方式,这些数据组织方式称之为Python的扩展数据结构,比如栈,队列等。

算法与数据结构的区别

数据结构只是静态的描述了数据元素之间的关系。

高效的程序需要在数据结构的基础上设计和选择算法。

程序 = 数据结构 + 算法

总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体

 

抽象数据类型(Abstract Data Type)

抽象数据类型(ADT)的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。

最常用的数据运算有五种:

  • 插入

  • 删除

  • 修改

  • 查找

  • 排序

 

参考资料

[1]https://www.cnblogs.com/sch01ar/p/8552295.html

原文地址:https://www.cnblogs.com/Nicholas0707/p/12716622.html