a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 139|回复: 1

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
前一段时间在博客园里看到这样一篇文章,那位兄弟谈到程序效率的关键是“简短”。他说,“程序越简短,其可执行代码就越少,就越有效率”,而在编写程序的时候,“要尽量改进我们的算法,而改进算法中最重要的一条,就是减少语句”。这句话从表面上似乎正确,但我认为性能这问题不能用“简短”这种方式去思考,否则会进入一些误区。我整理了一下思路,希望可以从几个方面把详细谈一下这个问题。4 Y7 K0 T* F# Z& E0 i6 P8 D+ b
    首先,如果说“简短的代码效率高”,那么什么叫作“简短”呢?姑且理解为“代码少”吧。如果“代码少”能够得出“效率高”,那我认为还需要其他一些条件,例如:( o! q$ E3 |' Q
    代码完全是顺序执行的& p$ f1 g* \) M* O  @: f7 j: Q
    每行代码的效率相同4 L1 D# ]  C' v# [1 E: ]
    但是,这对于使用高级语言的程序员来说,这两条基本上都无法成立,因为:
4 g( }- S, x- U. B/ U" `& F* D    代码中有条件跳转(如循环),因此一段简短的代码最终执行的“次数”可能比一段复杂的代码要多。这是很常见的情况,并非如那位兄弟所说“两三行代码写出死循环”这样的“特例”。
% x- d3 z* x+ ]" O5 V9 s3 a  I    每行代码的效率几乎不可能相同。试想一个i++和一个方法调用,他们的性能开销怎么可能相同呢?再者,这个特性并非是“高级语言”特有的,连CPU指令也是一样(以后我们再来详谈这个问题)。, V5 E7 \" @7 q( q1 v6 C
    其实这就是目前编程工作中不可能回避的现状,那就是高级语言并不直接反映出机器的执行过程。同时,我们不能从代码表面的简短程度来判断程序效率的高低。正如那位朋友所谈,影响程序的关键因素之一是算法的选择,但我不同意他说算法优化的关键在于“减少语句”。从一定程度上讲,选择高效的算法的确是为了减少指令执行的“总量”,但它并不是如那篇文章所说通过“少一些变量”,“少一些判断”来进行的,而是在于大幅的逻辑改变来减少总体的操作。3 u& g3 M4 J% D6 d
    事实上,我们很容易便能举出代码简短,但是性能较差的算法。就拿最常见的排序算法来说,冒泡排序不可谓不简单:4 d# `8 S9 R6 T2 ^
    点此展开点此折叠
: l0 {6 P/ ^% c- J    public void BubbleSort(int[] array)8 O2 g' R& N' @4 d' x; h
    {
  B4 r# [4 N. P/ i* M3 E% g    for (int i = array.Length - 1; i >= 0; i--)
' w" G% A3 A8 h5 P, C: U4 e! Q4 m9 k    {
! O2 y4 E) \! |6 W    for (int j = 1; j  array[j])
( o4 b5 [9 w7 i$ }: G    {
0 @/ Z5 j( W2 j/ J9 k2 B    int temp = array[j - 1];
  Y8 ?1 o( l* E    array[j - 1] = array[j];2 K% g! v* e/ C
    array[j] = temp;
% Z% A" s& m% n: \) z* a& I    }
2 p/ D, ~3 j7 x, }    }6 V$ W  j2 V# k* V
    }
回复

使用道具 举报

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

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

}而快速排序与之相比实在是复杂太多了:
6 _6 j0 E7 O0 ]1 r( a* P    点此展开点此折叠
/ w( s3 B( x; Y0 b8 m8 p    public void QuickSort(int[] array)2 O# i- m  H8 g6 J! d
    {" x8 V! s7 q6 i3 u) P) d; k
    QuickSortInternal(array, 0, array.Length);) o% Y3 r' X0 @4 |
    }
# {* V* W0 W1 I$ n# I+ c    private void QuickSortInternal(int[] array, int begin, int end), P) h# W9 X/ A# O5 V6 G
    {9 w# O8 @, j3 x9 j4 s
    if (end == begin)5 j2 v6 }! g9 m) [
    {9 i& D9 }# Q* M
    return;
& H: ~3 ~( J3 B" ?2 e    }
, G8 h' c; ]8 t& L6 i    else
7 w3 e* z+ |' w/ J6 s8 Q3 F    {7 v. Z4 }( r: v* Z4 i" Y+ y
    int pivot = FindPivotIndex(array, begin, end);- C( P- s+ }; {$ B2 \) n) u
    if (pivot > begin) QuickSortInternal(array, begin, pivot - 1);
! f* V! E1 _/ A/ ?    if (pivot < end) QuickSortInternal(array, pivot + 1, end);$ X1 {$ K& {, {! |9 m* n5 O- r
    }% j4 F  I. G  n( E9 ^
    }
3 c0 b: M- I7 J    private int FindPivotIndex(int[] array, int begin, int end)) d4 |! g1 x% _: L* [6 L
    {
6 }! J. n# p2 w3 L3 n) Q    int pivot = begin;6 ]/ [9 O* _' Q
    int m = begin + 1;6 Q7 w8 o; y; H. j9 Y; O9 H
    int n = end;
) Y$ Y- ?$ d- R! Q6 I3 _* I# m    while (m < end && array[pivot] >= array[m])- r+ M3 ]( R$ ~2 J2 F  x* K/ H
    {0 Z2 ?4 z' c6 I4 \3 _: B- n+ m
    m++;
! |1 ~% _; u" \. e; u3 `    }. |; G% C* f) h2 e+ T# b
    while (n > begin && array[pivot] = array[m])
) `) g; @% X$ T1 ~. O6 I    {
8 N$ i% q& T6 B  b! m/ @( r    m++;5 M7 s4 G* U4 l* h) k
    }
- V) I' @; F7 o7 |! Q$ p    while (n > begin && array[pivot]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 23:29 , Processed in 0.317243 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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