zoukankan      html  css  js  c++  java
  • 好的算法和差的算法对同一需求的实现,性能相差很大。

    随着计算机硬件性能不断提高,我感觉自己越来越忽视算法的重要性了。今天在codility网站做了一道很简单的Demo算法题,发现性能差的不是一点半点的。

    由于是Demo题,可以做多次,以下是我做2次的URL:

    1. http://codility.com/demo/results/demoTY95EX-RGY/ [一开始就想用最简单的方式实现功能需求,但没想到性能这么差,分数才50(100分制),时间复杂度:O(N*N)]

    2. http://codility.com/demo/results/demoWK3NEZ-5AB/ [这次实现还行,至少时间复杂度:O(N)]

    我也在本地机器使用以下代码做了以下测试,发现相同数据,花费时间差距非常之大。

    def solution(A):
        # http://codility.com/demo/results/demoTY95EX-RGY/
        import math
        _min_diff = None
        for _inx in range(1, len(A)):
            _diff = int(math.fabs(sum(A[:_inx])-sum(A[_inx:])))
            if _min_diff is None:
                _min_diff = _diff
            elif _min_diff > _diff:
                _min_diff = _diff
        return _min_diff
             
    def solution2(A):
        # http://codility.com/demo/results/demoWK3NEZ-5AB/
        _min_diff = None
        _sum = sum(A)
        _left_sum = 0
        for _inx in range(len(A)-1):
            _left_sum += A[_inx]
            _diff = _sum - _left_sum - _left_sum
            if _diff < 0:
                _diff = -_diff
            if _sum&0x01 == 0 and _diff == 0: #for even, minimal value is 0
                _min_diff = 0
                break
            elif _sum&0x01 == 1 and _diff == 1: #for odd, minimal value is 1
                _min_diff = 1
                break
            if _min_diff is None:
                _min_diff = _diff
            elif _min_diff > _diff:
                _min_diff = _diff
        return _min_diff
        
    
    def test(A):
        import time
        _start = time.time()
        _value = solution(A)
        _end    = time.time()
        print "solution result: time=%f, value=%d" % (_end-_start, _value)
        _start = time.time()
        _value = solution2(A)
        _end    = time.time()
        print "solution2 result: time=%f, value=%d" % (_end-_start, _value)

    输出结果:

    >>> A = [random.randint(-1000,1000) for _ in xrange(200)]
    >>> test(A)
    solution result: time=0.001000, value=14
    solution2 result: time=0.000000, value=14
    >>> A = [random.randint(-1000,1000) for _ in xrange(2000)]
    >>> test(A)
    solution result: time=0.077000, value=3
    solution2 result: time=0.001000, value=3
    >>> A = [random.randint(-1000,1000) for _ in xrange(2000)]
    >>> A = [random.randint(-1000,1000) for _ in xrange(20000)]
    >>> test(A)
    solution result: time=5.497000, value=24
    solution2 result: time=0.007000, value=24
    >>> A = [random.randint(-1000,1000) for _ in xrange(200000)]
    >>> test(A)
    solution result: time=667.812000, value=0
    solution2 result: time=0.016000, value=0

    A中有200,000元素的时候,算法1花费667秒,算法2才0.016秒。有点无语了,应该好好反省,今后在日常的开发中要更加重视算法(及数据结构)的选择。

  • 相关阅读:
    Block为什么使用Copy?
    iOS运行时,如何增加成员变量
    安卓长按交互onCreateContextMenu的简单 用法
    iOS 检查版本号的代码
    git的基本使用
    svn的使用
    const 关键字及作用
    常见的内存分配
    保存字符串的方法
    指针的总结一(指针的定义)
  • 原文地址:https://www.cnblogs.com/lxg226/p/3533317.html
Copyright © 2011-2022 走看看