算法导论第一、二章读书笔记

文章目录

  • 背景
  • 第一章 算法在计算中的作用
  • 第二章 算法基础
      • 插入排序
    • 分治法
      • 归并排序
  • 总结


背景

LeetCode刷题过程中,发现自己算法基础薄弱,本篇开始记录算法学习过程。
编程语言使用Java。

第一章 算法在计算中的作用

算法(algorithm) 是任何良定义的计算过程,改过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出

第二章 算法基础

  • 书中引入循环不定式概念证明算法的正确性,循环不定式包涵三条性质:初始化、保持、终止。
  • 伪代码约定:

插入排序

int[] insertionSort (int[] A) {
	int key;
	int i, j;
	for(j = 1; j < A.length; ++j) {
		key = A[j];
		for(i = j - 1; i >= 0 && A[i] > key; --i) {
			A[i + 1] = A [i];
		}
		A[i + 1] = key;
	}
	return A;
}

上述代码排序顺序为升序,改为降序只需更改比较方向。
分析算法: 最坏情况为初始数组逆序排列,Θ(n²)

分治法

思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归求解,再合并建立原问题的解
分析:T(n) = aT(n / b) + D(n) + C(n),a为子问题数量,b为子问题的规模,D(n)为分解成子问题的时间,C(n)为合并子问题的解为原问题的解的时间。

归并排序

归并排序算法完全遵循分治模式

int[] merge(int[] A, int low, int mid, int high) {
	int[] temp = new int[high - low + 1];
	int i = low;
	int j = mid + 1;
	int k = 0;
	while(i <= mid && j <= high) {
		if(A[i] <= A[j])
			temp[k++] = A[i++];
		else
			temp[k++] = A[j++];
	}
	while(i <= mid)
		temp[k++] = A[i++];
	while(j <= high)
		temp[k++] = A[j++];
	for(int l = 0; l < temp.length; ++l)
		A[l + low] = temp[l];
	return A;
}
int[] mergeSort(int[] A, int low, int high) {
	int mid = (low + high) / 2;
	
	if(low < high) {
		mergeSort(A, low, mid);
		mergeSort(A, mid + 1, high);
		merge(A, low, mid, high);
	}
	return A;
}

分析: 二路归并运行时间为T(n) = 2T(n / 2) + Θ(1),最坏情况为为 Θ(n lgn)。
递归树

总结

看完有种通透的感觉。

你可能感兴趣的:(Java,算法,java)