时间复杂度
O(1):加法减法运算
O(logn)、O(nlogn):循环中出现跳阶

i=1;
 while (i <= n)  {
   i = i * 2;
 }

O(m+n)、O(m*n):字符长度运算
image.png
浅析最好、最坏、平均、
均摊时间复杂度:查找字符串n,每个字符串出现的概率为n
image.png
为什么很多编程语言中数组都从0开始编号?沿用c语言设计
数据内存分布
image.png
image.png
链表插入

new_node->next = p->next;
p->next = new_node;

队列满状态:(tail+1)%n=head
排序注意点

排序算法的执行效率
排序算法的内存消耗:原地排序或其他
排序算法的稳定性

image.png
image.png
image.png
image.png
插入排序:数值对比,最后j+1 = value
image.png
image.png
选择排序
image.png
插入排序为什么比冒泡排序好:赋值操作比冒泡排序少
image.png
归并排序
image.png

// 归并排序算法, A 是数组,n 表示数组大小
merge_sort(A, n) {
  merge_sort_c(A, 0, n-1)
}
 
// 递归调用函数
merge_sort_c(A, p, r) {
  // 递归终止条件
  if p >= r  then return
 
  // 取 p 到 r 之间的中间位置 q
  q = (p+r) / 2
  // 分治递归
  merge_sort_c(A, p, q)
  merge_sort_c(A, q+1, r)
  // 将 A[p...q] 和 A[q+1...r] 合并为 A[p...r]
  merge(A[p...r], A[p...q], A[q+1...r])
}

快速排序: O(nlogn)
image.png
image.png

// 快速排序,A 是数组,n 表示数组的大小
quick_sort(A, n) {
  quick_sort_c(A, 0, n-1)
}
// 快速排序递归函数,p,r 为下标
quick_sort_c(A, p, r) {
  if p >= r then return
  
  q = partition(A, p, r) // 获取分区点
  quick_sort_c(A, p, q-1)
  quick_sort_c(A, q+1, r)
}

桶排序(Bucket sort)
image.png
基数排序(Radix sort)
image.png
image.png
无处不在的二分思想
image.png

public int bsearch(int[] a, int n, int value) {
  int low = 0;
  int high = n - 1;
 
  while (low <= high) {
    int mid = (low + high) / 2;
    if (a[mid] == value) {
      return mid;
    } else if (a[mid] < value) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
 
  return -1;
}

image.png

public int bsearch(int[] a, int n, int value) {
  int low = 0;
  int high = n - 1;
  while (low <= high) {
    int mid =  low + ((high - low) >> 1);
    if (a[mid] > value) {
      high = mid - 1;
    } else if (a[mid] < value) {
      low = mid + 1;
    } else {
      if ((mid == 0) || (a[mid - 1] != value)) return mid;
      else high = mid - 1;
    }
  }
  return -1;
}
public int bsearch(int[] a, int n, int value) {
  int low = 0;
  int high = n - 1;
  while (low <= high) {
    int mid =  low + ((high - low) >> 1);
    if (a[mid] > value) {
      high = mid - 1;
    } else if (a[mid] < value) {
      low = mid + 1;
    } else {
      if ((mid == n - 1) || (a[mid + 1] != value)) return mid;
      else low = mid + 1;
    }
  }
  return -1;
}
查找第一个大于等于给定值的元素
public int bsearch(int[] a, int n, int value) {
  int low = 0;
  int high = n - 1;
  while (low <= high) {
    int mid =  low + ((high - low) >> 1);
    if (a[mid] >= value) {
      if ((mid == 0) || (a[mid - 1] < value)) return mid;
      else high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  return -1;
}
查找最后一个小于等于给定值的元素
public int bsearch7(int[] a, int n, int value) {
  int low = 0;
  int high = n - 1;
  while (low <= high) {
    int mid =  low + ((high - low) >> 1);
    if (a[mid] > value) {
      high = mid - 1;
    } else {
      if ((mid == n - 1) || (a[mid + 1] > value)) return mid;
      else low = mid + 1;
    }
  }
  return -1;
}

跳表:插入、删除操作的时间复杂度也是 O(logn)
image.png
image.png
散列冲突:开放寻址法、链表法
hash算法使用场景:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储


微笑的死神
0 声望0 粉丝