1、时间复杂度解释一下 算法的时间复杂度,用来度量算法的运行时间,记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述。

  1. 当 T(n) = c,c 为一个常数的时候,我们说这个算法的时间复杂度为 O(1);如果 T(n) 不等于一个常数项时,直接将常数项省略。
  2. 因为高次项对于函数的增长速度的影响是最大的,所以我们直接忽略低次项。
  3. 因为函数的阶数对函数的增长速度的影响是最显著的,所以我们忽略与最高阶相乘的常数。

比如 T(n) = 29 ,此时时间复杂度为 O(1)。 比如 T(n) = n + 29,此时时间复杂度为 O(n)。 比如T(n) = n^3 + n^2 + 29,此时时间复杂度为 O(n^3)。 比如T(n) = 3n^3,此时时间复杂度为 O(n^3)。

for (int i = 2; i < n; i++) { 

i *= 2;
printf("%i\n", i);
}

复制

假设循环次数为t,必有2^t < n t = log(2)(n),即 T(n) = log(2)(n),可见时间复杂度为 O(log(2)(n)),即 O(log n)。

加入 T(n) = T(n – 1) + T(n – 2) 是一个斐波那契数列,通过归纳证明法可以证明,当 n >= 1 时 T(n) < (5/3)^n,同时当 n > 4 时 T(n) >= (3/2)^n。 所以该方法的时间复杂度可以表示为 O((5/3)^n),简化后为 O(2^n)。

面试题:数据结构和算法_子树


整数反转、以及溢出问题 反转数字是个很简单的问题,只需不断取模累乘即可 int t = x%10; res = res*10 + t; 判断溢出 res < INT_MAX/10,这种情况无论t为多大,都不会溢出; res > INT_MAX/10,这种情况无论t为多小,一定会溢出; res == INT_MAX/10,其中INT_MAX=2147483647,所以当t>7时,会发生溢出;

链接: 参考.


Unity游戏常用洗牌算法


【面试题】冒泡排序 冒泡排序(BubbleSort) 在排序过程中相邻元素不断比较交换,一些元素慢慢被换到最后 时间复杂度 最好时间复杂度是O(N) :相邻不需要交换 最坏时间复杂度是O(N^2):反序文件,一直交换

参考我的另一个博文 链接: 冒泡示意图和代码


二分查找 二分查找:在有序的集合中搜索特定值的过程 有序集合:Collection 目标:Target 索引:Index 左右指针:Left和Right 中间指针:Middle——根据条件来确定向左查找还是向右查找

进行二分查找的训练

链接: ​​leetcode二分查找算法​​.


【面试题】二叉树 二叉查找树(英语:Binary Search Tree),也称为 二叉搜索树、有序二叉树(Ordered Binary Tree)或排序二叉树(Sorted Binary Tree)。

具有下列性质的二叉树(可以是空树):

  1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
  2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
  3. 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节点

相比其他数据结构优势在于:查找插入的时间复杂度较低。

为 O(logn) 最坏是O(N)

改进版的二叉查找树可以使树高为 O(logn),从而将最坏效率降至 O(logn),如 AVL 树、红黑树等。

进行二叉树的训练

链接: ​​leetcode二叉搜索树算法​​.


== 【面试题】用栈实现队列 、 用队列实现栈 == 算法:2个栈实现队列 链接: ​​用栈实现队列​​.

算法:2个队列实现栈 链接: ​​用队列实现栈​​.