算法和数据结构要用来干什么

我们编写程序(做leetcode题),其实最终还是让计算机去“运算”的,而为了减小时间复杂度和空间复杂度,“算法”仍然是核心,“数据结构”只是为了实现算法的一个方便描述的工具、一个将问题抽象出来的存在;而结果的得出的过程则一种对问题的“模拟”。

大一时,我们通过对“语言基础”的学习,我们就已经知道了一些算法与数据结构:

如何构造数据结构

我们之前在 C++ 里学过结构体struct + 指针 + 动态创造内存(malloc函数),用它来定义一个数据结构,这种虽然严谨美观,但是有三大缺点:

  1. 每个变量名又臭又长,如果没有代码提示很容易打错(Compile Error)
  2. 指针充满了危险性,一不留神就容易出现内存泄漏/段错误(RE)
  3. 开空间的过程会导致程序运行的速度下降,可能会加大超时错误(TLE)的概率。

为了解决这几个问题,我们引入了一种船新的构造数据结构的方法:

  1. 简化变量名,在每道题里记住他们的含义,在开头打上注释;
  2. 使用静态数组方式模拟

比如我定义一个下面的数据结构:

定义数据结构:

typedef struct Node {
	int x;
	int y;
	string str;
	struct Node* next;
} Node;
typedef struct Node* NodeList;
// 开空间(动态):
NodeList L = (Node*)malloc(NUM * sizeof(Node));
// 指针初始化:
Node* ptr = L;
// 移动指针,创建新元素:
ptr++;

我们换成另外一种定义方法,开一个静态数组的空间