软件开发

编程语言

算法实现

Algorithm

算法复杂度分为时间复杂度和空间复杂度。

  • 时间复杂度是指执行算法所需要的计算工作量;

  • 空间复杂度是指执行这个算法所需要的内存空间;

时间复杂度

常见的时间复杂度量级有:

  • 常数阶O(1)

  • 对数阶O(logN)

  • 线性阶O(n)

  • 线性对数阶O(nlogN)

  • 平方阶O(n²)

  • 立方阶O(n³)

  • K次方阶O(n^k)

  • 指数阶(2^n)

备注

上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。

for(i=1; i<=n; ++i)
{
    j = i;
    j++;
}

该示例的时间复杂度为:O(n);整个耗时T(n) = (1+2n)*时间颗粒,算法的耗时是随着n的变化而变化,可以简化这个算法的时间复杂度表示为:T(n) = O(n),如果n无限大,T(n) = time(1+2n)中的常量1就没有意义了,倍数2也意义不大。因此直接简化为T(n) = O(n)

时间复杂度公式T(n) = O(f(n)) 中f(n) 表示每行代码执行次数之和,而O表示正比例关系,公式全称: 算法的渐进时间复杂度

哈希表解法

复杂度O(n)

时间复杂度和空间复杂度均为O(n)

双指针算法

如果最开始数组有序,可以利用 数组最大值+最小值和target的关系进行筛选,这样空间复杂度直接降到1,但是如果没有序的话,就要对原值进行排序,所浪费的空间和时间比起哈希表来讲,得不偿失。

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
    j = i;
    j++;
}

示例代码第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

编程练习leetcode

开发策略

RAF策略

RAF(Run and Fix) 是大量开发者和团队采用的开发策略,通过试错的方式降低精力投入,但在实际编写的代码最后可能会遗留下大麻烦,浪费不少于编码的时间进行修复。

  • 增加在程序构思阶段的时间投入

  • 采用流程图和伪代码,梳理程序逻辑

  • 在纸上投入的时间多于电脑

  • 事先预测可能的问题并寻找解决方法

  • 深思后再编程