Algorithm and Data Structure
算法与数据结构
我没有那种天分
我一无所知
展开
-
管理全局唯一变量的类(单例模式)
template<typename T>class Singleton {public: static T* instance() { return _s_instance; }protected: Singleton() {} virtual ~Singleton() {}private: //only declare; forbiden copy and assign Singleton(const Singleton.原创 2020-08-16 15:31:49 · 432 阅读 · 0 评论 -
堆排序(shiftDown, shiftUp, heapify)
堆排序的过程包含shiftDown, shiftUp, heapify原创 2020-03-20 09:10:47 · 1059 阅读 · 0 评论 -
冒泡,插入,归并,快速排序(优化)
冒泡排序如何优化?插入排序比一般的O(n2)的排序算法要好,因为它会提前终止;递归排序和快速排序有个优化点。原创 2020-03-19 15:28:08 · 199 阅读 · 0 评论 -
二分查找问题(BinarySearch, Floor, Ceil)
二分查找是很基本的查找算法,但二分查找的变种问题(floor, ceil)也很重要,并且不那么简单。原创 2020-03-14 12:40:31 · 199 阅读 · 0 评论 -
使用迭代实现二叉树的前中后序遍历(C++)
使用递归实现二叉树的前中后序遍历很简单,写法基本相同。但用迭代稍有不同,较递归稍难理解和记忆,但迭代效率更高。下面是用迭代实现二叉树的前中后序遍历的代码示例。#include <iostream>#include <vector>#include <stack>using namespace std;//Definition for a bina...原创 2020-01-18 17:27:52 · 1045 阅读 · 1 评论 -
B-树和B+树
转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html前面讲解了平衡查找树中的2-3树以及其实现红黑树。2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key。维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序...转载 2018-10-14 16:00:25 · 117 阅读 · 0 评论 -
算法-使用哨兵节点处理链表头部判断问题
###问题:删除链表中等于给定值val的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5###分析:如果是删除中间节点,问题很简单;但如果涉及头部连续的节点需要被删除,就很复杂。加入一个哨兵节点,让问题容易解决/** * Definiti...原创 2020-01-04 19:24:13 · 181 阅读 · 0 评论 -
广度优先遍历
广度优先搜索遍历类似于树的按层次遍历。 对于无向连通图,广度优先搜索是从图的某个顶点v0出发,在访问v0之后,依次搜索访问v0的各个未被访问过的邻接点w1,w2,…。然后顺序搜索访问w1的各未被访问过的邻接点,w2的各未被访问过的邻接点,…。即从v0开始,由近至远,按层次依次访问与v0有路径相通且路径长度分别为1,2,…的顶点,直至连通图中所有顶点都被访问一次。广度优先搜索的顺序不是...原创 2018-11-20 23:03:43 · 7509 阅读 · 0 评论 -
算法-用快慢指针解决循环问题
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。示例:输入: 19输出: true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1class Soluti...原创 2020-01-03 23:31:26 · 258 阅读 · 0 评论 -
算法-数组的相对排列(用map解决数组的频次问题)
#问题:给你两个数组,arr1 和arr2,arr2中的元素各不相同arr2 中的每个元素都出现在arr1中对 arr1中的元素进行排序,使 arr1 中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。示例:输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,...原创 2020-01-03 23:14:11 · 141 阅读 · 0 评论 -
算法---合并数字,使数组的最小值最大
给定一个整数数组arr[m],合并次数n,进行n次合并使得数组的最小值最大,求这个最大值例如:arr = {1, 7, 2, 2, 5, 9}, n = 3, 首先合并1, 7, 得到[8, 2, 2, 5, 9], 然后合并2, 2, 得到[8, 4, 5, 9], 最后合并4, 5, 得到[8, 9, 9], 数字的下限为8,即为所求。 解答:1. 从小到大选出n个数,记为A1...原创 2018-10-10 23:15:11 · 1367 阅读 · 9 评论 -
面试题-找出数组中第二大的数
int secondMaxNumber(int *arr, int n){ if(arr == NULL) return -1; int max = arr[0]; int i = 0; while(arr[i] == max) { i++; } int second = arr[i]; f...原创 2018-10-19 15:42:10 · 1851 阅读 · 0 评论 -
二叉树的基本概念与性质
二叉树的概念与性质:1.n个节点的二叉树一共有((2n)!)/(n! * (n+1)!)种 2.n层二叉树的第n层最多为2^(n-1)个 3.二叉树节点计算公式 N = n0+n1+n2,度为0的叶子节点比度为2的节点数多一个。N=1*n1+2*n2+1 4.对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1 5.具有n个节点的完全二叉树的深度为log2...原创 2018-10-14 12:51:18 · 1053 阅读 · 0 评论 -
经验1
内存不足时,试着把大的计算拆分成多个小的计算,有时会起到意想不到的效率。原创 2018-08-01 20:04:02 · 110 阅读 · 0 评论 -
深度优先遍历(递归和非递归实现)
深度优先搜索(Depth-First-Search,简称DFS)。这是一种常见的用于遍历或搜索树或者图的算法。基本实现思想:(1)访问顶点v;(2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;(3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。#include <vector>#include <queue>#include <sta...原创 2018-07-08 12:47:00 · 18056 阅读 · 0 评论 -
归并排序算法
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。基本思想:设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 temp (相当于输出序列)中,待合并完...原创 2018-05-14 21:37:26 · 124 阅读 · 0 评论 -
快速排序算法
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序平均时间复杂度为O(nlog2n),最坏时间复杂度为O(n2),最好时间复杂度为O(nlog2n),空间复杂度...原创 2018-05-14 10:31:18 · 94 阅读 · 0 评论