《算法》1.4算法分析

1科学方法

  • 观察,测量
  • 提出假设模型
  • 预测未来事件
  • 反馈矫正假设模型

1.1计算运行时间的计时器

实现:

/**
 * 计时器
 * @Author: AZhu
 * @Date: 2021/2/6 20:42
 */
public class Stopwatch {

    private final long start;//开始时间

    public Stopwatch() {
        start = System.currentTimeMillis();
    }

    /**
     * 返回对象创建以来所经过的时间
     * @return
     */
    public double elapsedTime() {
        long now = System.currentTimeMillis();
        return (now - start) / 1000.0;
    }
}

用例:

public static void main(String[] args) {
    //创建一个计时器
    Stopwatch stopwatch = new Stopwatch();
    //核心代码
    、、、、、、
    //获取时间间隔
    double time = stopwatch.elapsedTime();
    System.out.println("经过了:" + time + " 秒。");
}

2增长数量级

  • 常数级别
  • 对数级别
  • 线性级别
  • 线性对数级别
  • 平方级别
  • 立方级别
  • 指数级别

3设计更快的算法

3.1二分查找

/**
 * 实现二分查找的一个类
 * @Author: AZhu
 * @Date: 2021/2/6 21:01
 */
public class BinarySearch {

    /**
     * 在一个升序数组中查找给定的数
     * @param key 目标数
     * @param a 目标数组
     * @return 数组索引
     */
    public static int rank(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1;
        while (lo < hi) {
            //被查找的数要么不存在,要么存在lo和hi之中
            int mid = lo + (hi - lo) / 2;
            if (key < a[mid]) {
                hi = mid - 1;
            } else {
                if (key > a[mid]) {
                    lo = mid + 1;
                } else {
                    return mid;
                }
            }
        }
        return -1;
    }
}

3.2、2-sum问题

/**
 * 快速在一个无序数组中查找“两数和为0”的数对的数目(不重复)
 * @Author: AZhu
 * @Date: 2021/2/6 20:54
 */
public class TowSumFast {

    /**
     * 计算和为0的整数对的数目
     * @param a 目标数组
     * @return 整数对的数目
     */
    public static int count(int[] a) {
        //归并排序
        Arrays.sort(a);
        int N = a.length;
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            //查找-a[i]的位置
            if (BinarySearch.rank(-a[i], a) > i) {
                cnt++;
            }
        }
        return cnt;
    }

}

3.3、3-sum问题

/**
 * 快速在一个无序数组中查找“三数和为0”的三元组的数目(不重复)
 * @Author: AZhu
 * @Date: 2021/2/6 21:14
 */
public class ThreeSumFast {
    /**
     * 计算和为0的三元组的数目
     * @param a 目标数组
     * @return 三元组的数目
     */
    public static int count(int[] a) {
        //归并排序
        Arrays.sort(a);
        int N = a.length;
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                if (BinarySearch.rank(-a[i] - a[j], a) > j) {
                    cnt++;
                }
            }
        }
        return cnt;
    }
}

4倍率实验

  • 计算每次实验和上一次实验的运行时间的比值
  • 反复运行直到该比值趋近于极限 2^b

两个注意:

  1. 评估程序解决大型问题的可行性
  2. 评估使用更快的计算机做产生的价值

5注意事项

  • 大常数
  • 非决定性的内循环
  • 指令时间
  • 系统因素
  • 不分伯仲
  • 对输入的强烈依赖
  • 多个问题参量

6处理对于数据输入的依赖

  • 输入模型
  • 对最坏的情况下的性能的保证
  • 随机化算法
  • 操作序列
  • 均摊分析

7注意内存

  • 对象
  • 链表
  • 数组
  • 字符串对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值