转载部分

《数据结构与算法之美》01~05笔记

2019-08-10  本文已影响104人  太阳骑士索拉尔

关于我的仓库

前言

01讲为什么要学习数据结构和算法

课后题:你为什么要学习数据结构和算法呢?在过去的软件开发中,数据结构和算法在哪些地方帮到了你?

02讲如何抓住重点,系统高效地学习数据结构与算法

img

课后题:请思考一下你自己学习这个专栏的方法,你在之前学习数据结构和算法的过程中,遇到过什么样的困难或者疑惑吗?

03讲复杂度分析(上):如何分析、统计算法的执行效率和资源消耗

img img

O(1)

O(logn)、O(nlogn)

空间复杂度

复杂度增进曲线

img

课后题:有人说,我们项目之前都会进行性能测试,再做代码的时间复杂度、空间复杂度分析,是不是多此一举呢?而且,每段代码都分析一下时间复杂度、空间复杂度,是不是很浪费时间呢?你怎么看待这个问题呢?

04讲复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

加权平均时间复杂度 = 平均时间复杂度 = 期望时间复杂度

// n表示数组array的长度
int find(int[] array, int n, int x) {
  int i = 0;
  int pos = -1;
  for (; i < n; ++i) {
    if (array[i] == x) {
       pos = i;
       break;
    }
  }
  return pos;
}
img img

均摊时间复杂度

举例:

 // array表示一个长度为n的数组
 // 代码中的array.length就等于n
 int[] array = new int[n];
 int count = 0;
 
 void insert(int val) {
    if (count == array.length) {
       int sum = 0;
       for (int i = 0; i < array.length; ++i) {
          sum = sum + array[i];
       }
       array[0] = sum;
       count = 1;
    }

    array[count] = val;
    ++count;
 }

加权平均时间复杂度

img

均摊时间复杂度

课后题:你可以用今天学习的知识,来分析一下下面这个add()函数的时间复杂度。

// 全局变量,大小为10的数组array,长度len,下标i。
int array[] = new int[10]; 
int len = 10;
int i = 0;

// 往数组中添加一个元素
void add(int element) {
   if (i >= len) { // 数组空间不够了
     // 重新申请一个2倍大小的数组空间
     int new_array[] = new int[len*2];
     // 把原来array数组中的数据依次copy到new_array
     for (int j = 0; j < len; ++j) {
       new_array[j] = array[j];
     }
     // new_array复制给array,array现在大小就是2倍len了
     array = new_array;
     len = 2 * len;
   }
   // 将element放到下标为i的位置,下标i加一
   array[i] = element;
   ++i;
}

05讲数组:为什么很多编程语言中数组都从0开始编号

img img

数组越界:黄金体验镇魂曲--永远无法到达的彼岸

int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}

数组编号为什么从0开始,而不是从1开始

课后题

前面我基于数组的原理引出JVM的标记清除垃圾回收算法的核心理念。我不知道你是否使用Java语言,理解JVM,如果你熟悉,可以在回顾下你理解的标记清除垃圾回收算法。

前面我们讲到一维数组的内存寻址公式,那你可以思考一下,类比一下,二维数组的内存寻址公式是怎样的呢?

上一篇下一篇

猜你喜欢

热点阅读