1、时间复杂度解释一下 算法的时间复杂度,用来度量算法的运行时间,记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述。
- 当 T(n) = c,c 为一个常数的时候,我们说这个算法的时间复杂度为 O(1);如果 T(n) 不等于一个常数项时,直接将常数项省略。
- 因为高次项对于函数的增长速度的影响是最大的,所以我们直接忽略低次项。
- 因为函数的阶数对函数的增长速度的影响是最显著的,所以我们忽略与最高阶相乘的常数。
比如 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)。
具有下列性质的二叉树(可以是空树):
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
- 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节点
相比其他数据结构优势在于:查找插入的时间复杂度较低。
为 O(logn) 最坏是O(N)
改进版的二叉查找树可以使树高为 O(logn),从而将最坏效率降至 O(logn),如 AVL 树、红黑树等。
进行二叉树的训练
链接: leetcode二叉搜索树算法.
== 【面试题】用栈实现队列 、 用队列实现栈 == 算法:2个栈实现队列 链接: 用栈实现队列.
算法:2个队列实现栈 链接: 用队列实现栈.