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>Nf(n)总是比g(n)大。

那么,我们说f(n)的增长渐近快于g(n)

从刚才的对比中我们还发现,随着n的增大,后面的+3+1其实是不影响最终的算法变化曲线的。

例如算法A2B2,在图中他们压根儿被覆盖了。

所以,我们可以忽略这些加法常数。(维度不一样,攻击效果不一样)

算法时间复杂度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所占存储空间的函数。

空间复杂度就设计到计算机存储

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值