本人是一名人工智能专业的大一学生,在学长的推荐下,在今年的四月加入了Datawhale的大家庭(里面大佬是真的多),遇到了一群志同道合的朋友,大家都致力于AI方面的学习,积极向上,互相帮助的氛围,特别能感染我,欢迎大家加入Datawhale的大家庭,一起致力于AI方面的学习!!
加入方式:
微信公众号搜索:Datawhale
每个月都会举行组队学习的活动,可以在里面认识许多志同道合的好朋友!!!
01. 算法入门与数组篇
在此章节,我对数据结构与算法进行了初步的了解。
首先印象最深刻的一句话就是:
程序 = 算法 + 数据结构
1.程序:是算法和数据结构的具体实现。
2.算法:就是解决问题的方法或者过程。
3.数据结构:是数据的计算机表示和相应的操作,数据的组织结构,用来组织、存储数据。
其实在了解算法之前,一直以为算法是一个很高大上的词汇,只有那种顶尖的大佬才会的那
种,但其实不然,如果把写程序看成做菜的话,那「数据结构」就是食材和调料,「算法」
则是不同的烹饪方式,一道菜做的好不好,不但要选择好的食材和调料,更要熟悉掌握做的
技巧,才能做出一道色香味俱全的佳肴。
好!接下来我们对数据结构和算法展开细嗦:
数据结构:
一.数据的逻辑结构(数据元素之间的相互关系):
1.集合结构:类似于数学中的集合,具有无序性,确定性,互异性的性质
2.线性结构:构思出来一个一维空间,所有数据都在这条直线之上,其关系是线性的别看其
简单,但是由其衍生出来的各种算法思路却在整个算法框架里面起到不可或缺的作用。线性
结构类型包括:数组、链表,以及由它们衍生出来的栈、队列、哈希表。
3.树型结构:本人自认为该类型与我们平常在思维导图里面使用的树状图非常相似,存在着
一对多的操作。最简单的树形结构是二叉树。这种结构可以简单的表示为:根, 左子树, 右
右子树又有自己的子树。当然除了二叉树,树形结构类型还包括:多叉树、字典树等。
4.图形结构:是一种比较复杂的结构,存在着一对多的数据关系。
二.数据的物理结构(数据的逻辑结构在计算机中的存储方式)
1.顺序储存结构:数据储存在连续的一片区域内,内存的变化对应着数据的变化。
在C语言里表现为数组,开辟一片连续的空间。优点:操作比较简单,对数据的访问简便,
所占的内存较少。
2.链式储存结构:数据的储存是不连续的,将数据元素存放在任意的存储单元里。
在C语言里表现为链表操作。优点:操作较为复杂,所占的内存空间太大。
算法:
简而言之,是解决问题的方法。听起来简单,但我们在设计算法的时候,一定要遵循算法的
基本特性,才能设计出一个简介,高效的算法
算法的基本特性:
1.输入:即为你设计的算法设定初值,让其开始进行运算,当然如果你的算法是针对一个特定
的事件设计的(比如从家到学校怎么走最近),可以不用输入。
2.输出:即算法运算出来的结果,要解决问题的答案,是判断你设计的算法的好坏的直接体
现(总不能算出来你家到学校要走100公里吧),当然输出的形式是多样的。
3.有穷性:即你设计的算法必须在有限的步骤之后能计算出结果(总不能你八点要到学校
结果九点了还在被窝里面睡大觉吧)这一步是判断算法是否合理的主要部分。
4.确定性:即你写的每一行代码,每一个设计的思维,所代表的含义都必须是确定的(总不
能你只说去上学,不告诉我们该怎么走吧),虽然这一条性质理解起来不难,但我认为从这
里可以直观地展示出来一个人的思维是否清晰,逻辑表达是否清楚。
5.可行性:即你的代码是健康的,可以运行出答案的(总不能你要去上学,却发现自己的腿
断了吧)
算法追求的目标:
1.运行所需的时间更少
2.占用内存空间最少
01.01.02 算法复杂度(第 01 ~ 02 天)
1.算法复杂度(Algorithm complexity):在问题的输入规模为 n 的条件下,程序的时间使 用
情况和空间使用情况。
n 在不同类型的算法里面存在着不同的含义:
排序算法中:n 表示需要排序的元素数量。
查找算法中:n 表示查找范围内的元素总数:比如数组大小、二维矩阵大小、字符串长度、 二叉树节点数、图的节点数、图的边界点等。
二进制计算相关算法中:n 表示二进制的展开宽度。
2.时间复杂度(Time Complexity):在问题的输入规模为 n 的条件下,算法运行所需要花 费的时间,可以记作为 T(n)。
def algorithm(n):
fact = 1
for i in range(1, n + 1):
fact *= i
return fact
所有代码的运算次数为1+n+n+1=2n+2即为T(n)
3.渐进符号
存在三个符号
1.渐进确界符号,对函数F(x)可以找到G(x)存在n1,n2,使得n1*G(x)<=F(x)<=n2*G(x)
2.渐进上界符号,与上文类似,不过只能确定其上界
3.渐进下界符号,确定下界
4.时间复杂度的计算
1.常数O(1) 最简单的运算,无循环,无递归
2.线性O(n) 一层循环
3.平方O(n*n) 两层循环
4.阶乘O(n!) 全排列等方法
5.对数O(ln(n))二分查找
6.线性对数O(n*ln(n))递归
根据从小到大排序,常见的算法复杂度主要有:
O(1) < O(logn) < O(n) < O(n2) < O(2**n) 等。
5.空间复杂程度
空间复杂度(Space Complexity):在问题的输入规模为 n 的条件下,算法所占用的空间大
小,可以记作为 S(n)。一般将 算法的辅助空间 作为衡量空间复杂度的标准。