算法
傲然君
这个作者很懒,什么都没留下…
展开
-
C++ 遍历数组或集合
遍历数组时,除了常用到的 for(;???? 之外,还可以通过 for( : ),区别在于:前者使用索引遍历,后者直接使用元素遍历。 int reports[] = { 1, 2, 3, 4, 5, 6 }; for (int value : reports) { std::cout << value << std::endl; } std::list<...原创 2020-03-31 15:38:40 · 3332 阅读 · 0 评论 -
跳跃表
概念:平衡二叉树,既能够进行二分查找,又能快速添加和删除元素,但其维持平衡的代价比较高。 跳跃表,基于有序链表,通过在有序链表的节点上随机性的增加前进链接,即使用率均衡技术(大体上趋向于平衡)而不是强制性均衡,因此在查找时可跳过部分节点,其效率可比拟于二叉查找树。当节点的规模足够大时,表结构接近理想跳跃表,即高层节点数为底层节点数的一半。跳跃表的结构由多层构成,每一层都是一个有原创 2018-01-13 11:37:07 · 618 阅读 · 0 评论 -
判断一个正整数是否为2的乘方
判断正整数N是否为2的乘方(如16是2的4次方)?N & N-1 = 0求正整数N转换成二进制后数字“1”的个数。int ChargeOnesCountInNum3(int N) { int count=0; while(N) { ++count; N = N & (N-1); }原创 2018-01-13 12:08:11 · 402 阅读 · 0 评论 -
栈实现:入栈、出栈、取最小元素的时间复杂度都是O(1)。
场景:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。方法一:设两个栈A/B,A:存放原始数据,B:栈顶为最小元素,其余为最小元素的备胎;入栈: (1) 当第一个元素进入栈A时,索引“0”进入栈B。索引“0”所指即为栈A的当前最小值; (2) 每当新元素进入栈A时,将新元素与B的栈顶元素(即栈A当前原创 2018-01-13 16:46:42 · 9659 阅读 · 1 评论 -
求两个正整数的最大公约数
辗转相除法两个正整数a和b(a>b)的最大公约数等于a除以b的余数c和b之间的最大公约数。更相减损术两个正整数a和b(a>b)的最大公约数等于a-b的差值c和较小数b的最大公约数。对于给定的正整数a和b,把辗转相除法和更相减损术相结合,在更相减损术的基础上使用移位算法,不难得到如下的结论。其中gcb(a,b)的意思是a,b的最大公约数函数:当a和b均为偶数,gcb(a,b)原创 2018-01-13 20:20:10 · 1345 阅读 · 0 评论 -
B树 解析与源码
概念B树,是普遍运用于文件系统和数据库的一种多叉(即,每个非叶子结点可以有多个孩子)平衡查找树。数据库索引为什么采用B树/B+树结构?数据库索引存储在磁盘上,当数据库的数据量比较大时,索引可能高达几G,甚至更多。所以在利用索引查找时,不会一次性把整个索引加载到内存,而是每次只加载一个磁盘页(这里的磁盘页对应索引树的结点)。若索引树采用二叉树结构,则一个页面只能存放一个值。因此原创 2018-01-31 11:17:10 · 6007 阅读 · 4 评论 -
B+树
概念B+树,是B树的一种变形树。特性一棵m阶的B+树与m阶的B树的差异在于:若某节点有n个孩子,则该结点包含的关键字个数为n; (对于B树,节点包含的关键字个数为:n-1)B+树的数据(关键字及指向关键字记录的指针)都存储在叶子结点中,分支结点均为索引(其子树根结点中最大/最小关键字),且叶子结点是按关键字自小而大的顺序链接。 (对于B树,分支结点和叶子结点都存储数据)原创 2018-02-06 11:10:31 · 2172 阅读 · 0 评论 -
求无序数组排序后相邻两个数的最大差值
方法一(位图法):遍历原数组,求出最大值Max和最小值Min;创建一个长度为k(k=Max-Min+1)的新数组Array;遍历原数组,把原数组每一个元素插入到新数组Array对应的位置,比如元素的值为n,则插入到Array[n-min]当中。此时Array的部分位置为空,部分位置填充了数值。遍历新数组Array,统计出Array中最大连续出现空值的次数+1,即为相邻元素最大差值。原创 2018-02-06 15:48:39 · 2317 阅读 · 1 评论