算法学习
前端小白_no error
这个作者很懒,什么都没留下…
展开
-
链表介绍
链表链表结构底层的存储结构:从图中我们看到,数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。单链表链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起原创 2020-12-14 21:47:45 · 1260 阅读 · 1 评论 -
数组介绍
数组数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。 与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。 连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”原创 2020-12-13 14:43:22 · 329 阅读 · 0 评论 -
均摊时间复杂度
均摊时间复杂度 // 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原创 2020-12-13 14:42:07 · 204 阅读 · 0 评论 -
最好、最坏、平均情况时间复杂度
最好、最坏情况时间复杂度// 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; } return pos;}这段代码要实现的功能是,在一个无序的数组(array)中,查找变量 x 出现的位置。如果没有找到,就返回 -1。按照上节课讲的分析方法,这段代码的复杂度是 O(原创 2020-12-13 14:41:05 · 4159 阅读 · 2 评论 -
空间复杂度介绍
空间复杂度空间复杂度表示算法的存储空间与数据规模之间的增长关系。void print(int n) { int i = 0; int[] a = new int[n]; for (i; i <n; ++i) { a[i] = i * i; } for (i = n-1; i >= 0; --i) { print out a[i] }}跟时间复杂度分析一样,我们可以看到,第 2 行代码中,我们申请了一个空间存储变量 i,但是它是常量阶的,跟数据规原创 2020-12-13 14:39:00 · 471 阅读 · 0 评论 -
时间复杂度介绍
时间复杂度O(1)O(1)O(1)首先你必须明确一个概念,O(1)O(1)O(1) 只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如这段代码,即便有 3 行,它的时间复杂度也是 O(1)O(1)O(1),而不是 O(3)O(3)O(3)。int i = 8;int j = 6; int sum = i + j;只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度我们都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时原创 2020-12-13 14:34:13 · 400 阅读 · 1 评论