a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 153|回复: 1

[考试辅导] Oracle技术:代码的执行效率与算法浅谈

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
前一段时间在博客园里看到这样一篇文章,那位兄弟谈到程序效率的关键是“简短”。他说,“程序越简短,其可执行代码就越少,就越有效率”,而在编写程序的时候,“要尽量改进我们的算法,而改进算法中最重要的一条,就是减少语句”。这句话从表面上似乎正确,但我认为性能这问题不能用“简短”这种方式去思考,否则会进入一些误区。我整理了一下思路,希望可以从几个方面把详细谈一下这个问题。
8 h% r& Z5 B8 _! p, u$ o8 z2 [) A    首先,如果说“简短的代码效率高”,那么什么叫作“简短”呢?姑且理解为“代码少”吧。如果“代码少”能够得出“效率高”,那我认为还需要其他一些条件,例如:5 |) R* y/ w7 \4 ]* j( z0 G
    代码完全是顺序执行的
: w3 X. X) O0 H( h- W    每行代码的效率相同
8 C- q2 ~/ x7 u' M7 N* L    但是,这对于使用高级语言的程序员来说,这两条基本上都无法成立,因为:
( S5 M6 w( v+ D/ y" g    代码中有条件跳转(如循环),因此一段简短的代码最终执行的“次数”可能比一段复杂的代码要多。这是很常见的情况,并非如那位兄弟所说“两三行代码写出死循环”这样的“特例”。
: U+ N7 A% n6 m    每行代码的效率几乎不可能相同。试想一个i++和一个方法调用,他们的性能开销怎么可能相同呢?再者,这个特性并非是“高级语言”特有的,连CPU指令也是一样(以后我们再来详谈这个问题)。
7 }: v# b. l& R) o5 y    其实这就是目前编程工作中不可能回避的现状,那就是高级语言并不直接反映出机器的执行过程。同时,我们不能从代码表面的简短程度来判断程序效率的高低。正如那位朋友所谈,影响程序的关键因素之一是算法的选择,但我不同意他说算法优化的关键在于“减少语句”。从一定程度上讲,选择高效的算法的确是为了减少指令执行的“总量”,但它并不是如那篇文章所说通过“少一些变量”,“少一些判断”来进行的,而是在于大幅的逻辑改变来减少总体的操作。
0 x9 s7 N! f+ V1 _5 v    事实上,我们很容易便能举出代码简短,但是性能较差的算法。就拿最常见的排序算法来说,冒泡排序不可谓不简单:' J& o: W6 W6 V. s- P  {( y
    点此展开点此折叠1 T" D* S) _9 u$ a4 p' ]
    public void BubbleSort(int[] array)
3 n, Z9 |4 X5 O$ h    {4 }- o3 {8 _! j: L7 v
    for (int i = array.Length - 1; i >= 0; i--)! e5 `) T2 \4 H0 G: b* T
    {
; k% Z" u5 {7 u+ u3 j, V0 G    for (int j = 1; j  array[j])( m5 |5 M8 v8 k9 B( p
    {) A+ R2 C  Z* S% o! x$ B
    int temp = array[j - 1];
3 Q5 X. s6 k, [" @    array[j - 1] = array[j];; l, c: e, g' l! n1 R- A
    array[j] = temp;
6 _- V4 [% f& }& w! M- o9 }# }# }    }
# @1 s$ i0 n3 m1 K3 f    }" n; B/ \1 r  m5 G- U! ?$ S
    }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:代码的执行效率与算法浅谈

}而快速排序与之相比实在是复杂太多了:4 H8 G( W+ p" \  W/ A* W
    点此展开点此折叠
  L9 d' ^( \# `# Y" M$ |4 d* H5 |0 G    public void QuickSort(int[] array)
2 ]# ]' h% e6 q/ V4 x# R    {
5 l8 Y, a: @3 ^    QuickSortInternal(array, 0, array.Length);' P  q7 Q/ ~4 r+ j& {1 ^7 Q) H, p
    }
5 s, N) E5 v) M! m    private void QuickSortInternal(int[] array, int begin, int end)  n+ D* U: Q  ]$ i' J0 ?# g9 c  w6 \
    {
* \0 E. H4 |' S; B8 m    if (end == begin)/ V5 S4 _+ t1 m2 q3 n) ?0 m
    {
3 H3 p6 k, ?  h) ]; G$ G7 ?9 j, {    return;; r  B" u. x' t: D
    }
! \5 n2 m+ R5 J* j, s8 T    else; o  S( f6 a/ D; r1 {0 _, E
    {+ V! u) ~% d7 u, l0 @4 a  A7 x
    int pivot = FindPivotIndex(array, begin, end);
6 Q: q: i& n. n- u' K: p    if (pivot > begin) QuickSortInternal(array, begin, pivot - 1);1 K8 T3 r* M' E) I6 b
    if (pivot < end) QuickSortInternal(array, pivot + 1, end);
5 F2 D% l/ F# S. ?9 |    }$ U  {( S+ Y3 u( ~/ y
    }
1 X2 B' q' k8 q4 E! {2 k    private int FindPivotIndex(int[] array, int begin, int end); u8 n! d' d* q# f$ X) g
    {8 I5 b3 t( U% B  Q9 E8 j
    int pivot = begin;& Y4 _. L) u" ^
    int m = begin + 1;
- w/ b; d: A6 x) \7 D( m- r    int n = end;5 h  Y) W# F1 h4 i: o9 @" c/ f5 f
    while (m < end && array[pivot] >= array[m])
2 X$ |: Q$ @8 J    {  {. G% b' c* A
    m++;% E! w1 X: `7 J
    }0 i; D) s6 p5 N/ r9 c) R
    while (n > begin && array[pivot] = array[m])  M' E& u. O+ h( k0 u4 a
    {4 i) `+ l$ I2 m
    m++;
3 M; ^2 H! F- X    }
4 }5 j7 M$ ^/ v; e4 i, R$ G    while (n > begin && array[pivot]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-28 08:17 , Processed in 0.209598 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表