数据结构 学习记录 1

数据结构 学习记录 1

A 计算

1.什么是算法?

  • 计算 = 信息的处理

    借助某种工具,遵照一定的规则,以明确而机械的形式进行

  • 计算模型 = 计算机 =信息处理工具

  • 所谓算法,即在特定计算模型下,旨在解决特定问题的指令序列

    • 输入:待处理的信息(问题)
    • 输出:经处理的信息(答案)
    • 正确性:的确可以解决指定的问题
    • 确定性:任一算法都可以描述为基本操作组成的序列
    • 可行性:每一基本操作都可以实现,且在常数时间内完成
    • 有穷性:对于任何输入,经有穷次基本操作,都可得到输出
  • 举个例子:
    在这里插入图片描述
    那么对于这个例子来说,输入就是直线L上的点p,输出就是经过p且垂直于L打的直线,在这个由绳子组成“计算模型”,运行了得到垂线这个算法

2.算法有穷性:

关于算法的有穷性上面已经介绍到了,现在举一个例子:Hailstone Sequence。

希尔顿序列问题是一个著名的数学问题,至今未证明其正确性,也没证明其错误性,即任何一个正整数N,如果是偶数的话就除以2,如果是奇数的话就乘以3再加上1,最后这个数都会变为1。其表达式如下:
在这里插入图片描述
通过递归发现,每次对n这个数字进行判断奇偶性,采用不同的计算公式。例:当n=5的时候,结果:Halistone(5)={5,16,8,4,2,1}

我们针对这个过程写出一个程序:

1int halistone(int n)
{
	int length =0;
	while(n>1)
    {
		(n%2)?n/=2:n=n*3+1;
		length++;
	}
	return length;
}

当我们输入n = 5,程序能在有穷次得到输出,那当我们输入n = 27的时候了?我们可以给出:

Halistone(27)={27,82,41,124,62,31,94,47,142,71,214,107, … }

那么我们可以看到,该程序无法判断有穷性,不满足对于任何输入这一条件,所以该程序不能作为算法。

总结:程序未必等于算法,要满足算法的有穷性。

3.好算法:

什么是一个好算法?这个问题并不能很好的回答的问题,列举一下几点:

  • 正确:符合语法、能够编译、链接
  • 健壮性:能辨别不合法的输入并做适当处理,而不会非法退出
  • 可读性:结构化 + 准确命名+ 注释 + … …

这些确实是一个好算法的一些方面,但是从数据结构的角度来讲,我们其实最需要关注的一点是

  • 效率(Efficiency):速度尽可能快,存储空间尽可能少(既要马儿快快跑,也要马儿吃得少!)

B 计算模型

To measure is to konw.

If you can not measure it,you can not improve it.

1.算法分析

  • 正确性:算法功能与问题是否一致?
  • 成本:运行时间 + 所需存储空间(如何度量 + 如何比较?)
  • 考察:如果我们定义一个通用的数学公式T(n)来计算算法的时间成本,意义不大…毕竟可能出现的问题实例太多,如何归纳概括?
  • 观察:问题实例的规模,往往是决定计算成本的主要因素。规模接近,计算成本也接近;规模扩大,计算成本也上升。
  • 那么,如果我们计算:用算法A求解某一问题规模为n的实例,所需的计算成本讨论特定算法A(及其对应的问题)的时间T(n)来进行对比了?这样仍然有问题… …因为同一问题等规模的不同实例,计算成本不尽相同,甚至有本质的区别。

既然这样,那么我们该怎么定义计算成本T(n)了? 同一问题等规模的不同实例,计算成本不尽相同,那么,在规模同为n对的所有实例中,我们只关注最坏(成本最高)者来作为其计算成本T(n)。以最坏的情况作为准则的原则,这也是很好理解。上述方法为对特定算法的评价。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值