2018-3-1 算法学习部分
1:算法的Python实现 数据结构以及算法的基本概念
通过小甲鱼论坛中的数据结构部分进行理解基本的概念的自我理解:
数据结构官方:数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科
小甲鱼论坛:
【新提醒】★第一讲-数据结构和算法绪论★,数据结构与算法,技术交流区,鱼C论坛 - Powered by Discuz!
http://bbs.fishc.com/forum.php?mod=viewthread&tid=95983&ctid=1041
结合小甲鱼论坛的自我理解:
首先是一门学科,这门学科的研究内容是关系,就是一大堆数据给出他们之间的潜在规则或联系。总得来说就是一种或多种关系的集合。
数据结构说明元素的关系以及数据,而算法就是将这些数据以及关系的基础之上进行规则操作从而“程序设计”
集合结构
线性结构
图形结构类似于一个网络
树形结构:父与子的关系
顺序存储:
数据元素存放在连续的地址单元,逻辑上是先来的存储上也是先来的
链式存储:
大家之间有链接,没必要每次连续的排队,就是类似于生活中的社交,我找到村长,村长找到县长,等等(不知道自己这么想对不对,反正和论坛上不一致)
算法:
来源:
【新提醒】★ 第二讲-谈谈算法 ★,数据结构与算法,技术交流区,鱼C论坛 - Powered by Discuz!
http://bbs.fishc.com/forum.php?mod=viewthread&tid=96005&ctid=1041
官方定义:(不用太认真)
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
小甲鱼解释:
算法就是你泡妞儿的技巧和方式。
当你是一个单纯的以为写封情书,并告诉妹子,“我爱你”,就能拿啥的单纯boy,注定单身撸代码。
假如你是像小甲鱼一样,高傲,孤冷,套路很多的老司机,注定彩旗飘飘~
就像没有药可以包治百病一样
一个问题可以由多个算法解决
一个算法也不可能具有通解所有问题的能力
---小甲鱼
自我理解:
做一件事,达到目的的设计出来的一套捷径。毕竟有近路谁都不愿意绕远。那些捷径最终成为了牛逼的算法留在了我们的试卷上。
算法要有输出:不然是干吃(输入)不拉(输出)笑哭
有穷性:算法要有结束,要休息
确定性:不能老是搞暧昧的关系,不清楚具体的真正要什么
可行性:不能运行,不能实施,你还有做吗?
就是一个算法不仅仅只是在运行正确的情况下顺利的进行,还要在出现错误的时候能够自行的修补,给出线索,就相当于自己能了一个调试的应用
算法复杂度:
来源:
【新提醒】★ 第三讲-时间复杂度和空间复杂度 ★,数据结构与算法,技术交流区,鱼C论坛 - Powered by Discuz!
http://bbs.fishc.com/forum.php?mod=viewthread&tid=96069&ctid=1041
两大算法度量方法:
效率的度量方法:
主要的操作步骤执行的次数进行比较
以下摘自论坛:
函数的渐进增长
做一个测试:判断一下四个算法哪个更好?(输入规模都是n)
算法A1:
2n+3
算法A2
2n
算法B1:
3n+1
算法B2:
3n
当n=1时,算法A1效率不如算法B1,当n=2时,两者效率相同;
当n>2时,算法A1就开始优于算法B1了,随着n的继续增加,算法A1比算法B1逐步拉大差距。
所以总体上算法A1比算法B1优秀。
渐进增长定义
渐进增长:
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大。
那么,我们说f(n)的增长渐近快于g(n)
从刚才的对比中我们还发现,随着n的增大,后面的+3和+1其实是不影响最终的算法变化曲线的。
例如算法A2,B2,在图中他们压根儿被覆盖了。
所以,我们可以忽略这些加法常数。(维度不一样,攻击效果不一样)
算法时间复杂度2,小甲鱼论坛:【新提醒】★第四讲 时间复杂度和空间复杂度2 ★,数据结构与算法,技术交流区,鱼C论坛 - Poweredby Discuz!
http://bbs.fishc.com/forum.php?mod=viewthread&tid=96149&ctid=1041
官方定义:
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
本质:执行次数==时间
这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。
分析大O阶
如何分析一个算法的时间复杂度呢?
即如何推导大O阶呢?
◊用常数1取代运行时间中的所有加法常数。
◊在修改后的运行次数函数中,只保留最高阶项。
◊如果最高阶项存在且不是1,则去除与这个项相乘的常数。
◊得到的最后结果就是大O阶。
常用的时间复杂度所耗费的时间总结:
O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) <O(2^n) < O(n!) < O(n^n)
我们通常说的运行时间都是最坏情况下的运行时间
当直接要让我们求“复杂度”时,通常指的是时间复杂度。
算法的空间复杂度:
1. S(n)=O(f(n))
其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
空间复杂度就设计到计算机存储