来看看这个函数的时间复杂度是多少

2016-12-26 00:16:20 +08:00
 lxiange

不要紧张,请看代码:

void foo1(int n) {
	int bar = 0;
	for (int i = 0; i < n; i++) {
		bar++;
	}
}

请问foo1的时间复杂度?:P

12425 次点击
所在节点    程序员
168 条回复
scnace
2016-12-26 08:54:23 +08:00
吃瓜群众表示:我就喜欢看打脸。
WalkingEraser
2016-12-26 08:56:05 +08:00
学过计算理论的 211 渣本,表示 excuse me ?
Kilerd
2016-12-26 08:57:37 +08:00
第一个回帖的我,现在再来看看。
本以为很菜的我瞬间找到了些许自信。😃😃😃
mianju
2016-12-26 09:01:13 +08:00
那么问题来了,原题和改卷子算的答案到底是什么?
mnzlichunyu
2016-12-26 09:11:21 +08:00
吓得我又去看了一下算法导论的第一章。
mengzhuo
2016-12-26 09:33:56 +08:00
excuse me? 这尼玛是 2^n ?回去种地吧
coderluan
2016-12-26 09:59:43 +08:00
民科笑尿
zacard
2016-12-26 10:05:14 +08:00
能把原题截图发出来吗。。。不敢相信我滴眼睛。
lxiange
2016-12-26 10:05:25 +08:00
@xupefei 请看 https://en.wikipedia.org/wiki/Time_complexity 第一句话“... a function of the length of the string representing the input.”

@binux 你的意思是,当输入是数组时,大 O 表示法中的 n 指的是按照数组长度来看待。而输入为一个数时,却指的是其表示的值咯?有点双重标准了吧?同样看一下维基百科第一句话。

@lc4t :)

@jedihy 算法导论上讲的从来都是输入的规模,

@mnzlichunyu 不用看了,算法导论上没有的

@zmj1316 但是图灵机的基本概念总要讲吧?目前的计算理论,都要基于图灵机这个计算模型吧。

@RecursiveG
@xcatliu
@Perry
我做得不好的地方是,写的函数里不应该使用函数这个变量,使得看起来好像“重定义”了 n (其实并没有)
大 O 表示法中的 n ,指的是图灵机下的输入规模(如果把图灵机看成纸带的话,就是输入纸带长度),这点定义得很清楚(不是我定义的,维基百科上也有引用来源供查阅)。而它表示的值,是 10101100 这个数是什么,图灵机是不区分的,只认为它的输入规模为 8 。

输入一个数字,就把它当成大 O 表示法中的 n 。那要是输入一个 double 呢?还是 o ( n )咯?那再输入一个 char 呢?或者输入一个 string 呢?再输入一个数组?这时候 n 是什么?
不觉得你们才是在不断地“重定义 n ”么?

欢迎打脸,我也希望我是错的,回头我去打 etone :P
xiuc001
2016-12-26 10:09:50 +08:00
O(n)
kmyzzy
2016-12-26 10:10:11 +08:00
瞎鸡巴扯
debiann
2016-12-26 10:18:18 +08:00
@lxiange 如果用你采用的这个混乱的符号系统,那么楼上说 O(n)的意思是指 O(n(n)); n(n)=2^n
nagato
2016-12-26 10:20:20 +08:00
我天,是不是 2^n 你自己去打个 Log 不就知道了吗,辣眼睛啊
Inn0cence
2016-12-26 10:21:56 +08:00
@nccers CPU 分支预测
xcatliu
2016-12-26 10:24:42 +08:00
@nagato 让他自己去打个 log 他还是会认为他是对的,因为他的 n 和你定义的 n 不同。。
sudoz
2016-12-26 10:24:59 +08:00
@lxiange 考研 408 是什么?
Perry
2016-12-26 10:25:58 +08:00
维基百科哪句话说 big O 里的 n 必须是图灵机器的输入?
ispinfx
2016-12-26 10:26:27 +08:00
很后悔点进来,时间被浪费了。
lxiange
2016-12-26 10:27:30 +08:00
@debiann 嘿嘿,我才没有混乱呢,算法的时间复杂度就应该是根据图灵机下的输入规模来评判。

相反,认为是 O(n),才会引起混乱,

大伙再看看这个函数,时间复杂度是指数级没有歧义吧?
void foo5(char[] arr) {
int num = atoi(arr);
int bar = 0;
for (int i = 0; i < num; i++) {
bar++;
}
}

“ 123456 ”和 123456 ,它们的输入大小几乎是一样的,但凭啥前者是指数复杂度,后者就是线性复杂度了呢?
panzhougeek
2016-12-26 10:28:01 +08:00
不知所云。瞎几把扯就楼主最屌了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/330114

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX