究竟如何才算是o(n)时间?

纯净水o 2012-03-28 04:20:59
我现在有些搞不明白了
打个比方
一个数组8个元素 将其排序要求在o(n)时间内解出

只是打个比方
按照起泡排序
需要o(n^2)

然后 如果for(i = 1; i <=8; i++)
这样算是线性? 应该是因为1-8每个元素只便利了一遍
看下面
for(i = 1; i<=8; i++)
;
for(i = 1;i <= 8; i++)
;

也就是说1-8我循环了2次
这种也属于o(n)时间内??还是o(2n)?

如果是o(2n)我就搞不明白了
因为最近在做一道题 输油管道问题
里面的关键所在 就是求一些数的中位数
比如说 1-8个元素 排好序之后 求之中的 中间那个数

通俗点说就是N个数求第K小的数是那一个
我看了百度上的很多回答 都说这种解法 利用快速排序法
便可以在o(n)时间内完成

我仔细想想不对啊 1趟快排已经用了o(n)次 更何况1趟快排 不可能得到第K小的元素
所以我现在有些搞不明白了 究竟怎样才算是o(n)??
...全文
238 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大笨狼 2012-04-05
  • 打赏
  • 举报
回复
一个数组8个元素 将其排序要求在o(n)时间内解出


这个题目问的不对,算法输入规模,不应该是常数,而是某个数量范围.

元素数量少,8个元素,冒泡是64,快排24次,没什么明显差异.

1-8个元素 排好序之后 求之中的 中间那个数,O(1)就得到了

没排序的话,中位数是O(n)的,其实是O(K*n)因为K及其小,所以忽略

随便找一张牌,一堆比我大,一堆比我小;
向着中位数可能的那堆,丢弃另一堆,再重复这个过程;

次数的极限是常数,算法概论上有证明.
昵称很不好取 2012-04-02
  • 打赏
  • 举报
回复
O(N)说白是只需要遍历1次或是几次,1*n,2*n,这些都是属于0(n)
JieTouLangRen 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

由幂来确定,和系数无关,和常数无关
[/Quote]
++
常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3)。。。
freud.wy 2012-03-31
  • 打赏
  • 举报
回复
第一次分划用了 n次 第二次用了n/2 第三次n/4。。。 按照等比数列的求和最后大约为2n
shienaiwun 2012-03-31
  • 打赏
  • 举报
回复
对输入规模呈线性关系的意思。
cnmhx 2012-03-31
  • 打赏
  • 举报
回复
循环一遍就是o(n),双重循环就是o(n^2)嘛!
  • 打赏
  • 举报
回复
求解时间与数据规模之间是线性关系的算法时间复杂度就是O(n)。
wizard_tiger 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

由幂来确定,和系数无关,和常数无关
[/Quote]
++
TsinghuaADer10 2012-03-28
  • 打赏
  • 举报
回复
大O表达式时间复杂度n的系数不用给出100000*n复杂度也算O(n)。关键是问题复杂度规模。可以考虑桶排序。
V68V6 2012-03-28
  • 打赏
  • 举报
回复
由幂来确定,和系数无关,和常数无关
wzhiyuan 2012-03-28
  • 打赏
  • 举报
回复
最高次数是n的一次方就叫O(n)
n叫O(n),n/2叫 O(n),100*n+50 也叫O(n)

keeya0416 2012-03-28
  • 打赏
  • 举报
回复
O(2n) 就是 O(n) 因为O里隐含了系数K

N个数求第K小的数
那个貌似是叫 nth-element 的吧
只是利用了快排的思想 并不是排序好了再取的
wshcdr 2012-03-28
  • 打赏
  • 举报
回复
我仔细想想不对啊 1趟快排已经用了o(n)次 更何况1趟快排 不可能得到第K小的元素

在一个已排好序的数组中找第K小的元素,是个O(1)的复杂度

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧