数据结构与算法
AndyFlyingZZZ
讨厌全局变量
展开
-
位运算:Brian Kernighan算法
Brian Kernighan算法可以用于清除二进制数中最右侧的1。Brian Kernighan算法的做法是先将当前数减一,然后在与当前数进行按位与运算。x=x&(x-1)举个例子,20的二进制表示为10100,其最右侧的1在第三位上。20-1=19,19的二进制表示为10011,10100&10011=10000。可以看到,Brian Kernighan算法可以二进制数将最右侧的1清除。...原创 2020-08-23 13:49:32 · 1779 阅读 · 0 评论 -
哈夫曼编码(Huffman Coding)原理、运行步骤、python实现
哈夫曼编码是贪心算法的一个典型应用。哈夫曼编码利用每条数据出现的频率(概率),从信息论的角度出发,将这些数据重新编码。哈夫曼编码的编码结果是给出现频率较高的数据一个较短的编码,给出现频率较低的数据一个较长的编码。让我们举个例子说明一下哈夫曼编码的步骤:现在有数据[a,a,a,a,a,b,b,b,b,c,c,c,d,d,e]。可以看出字符a出现了5次,字符2出现了4次,字符c出现了3次,字符d出现...原创 2020-03-14 00:25:25 · 4272 阅读 · 0 评论 -
十大排序算法一句话概括
一句话概括十大排序算法的思想冒泡排序:两个相邻元素比较,如果顺序相反则交换位置。插入排序:假设前面的数字都已经排好序,再向有序数组中插入一个元素,使得插入后的数组有序。选择排序:选择未排序数组中最大或者最小的数组放在前面。希尔排序:按照增量不同,进行多次插入排序。归并排序:将两个有序的数组合并成一个有序的数组,运用分治算法的思想解决排序问题。堆排序:将数组看成一个堆,运用堆的性质完成排...原创 2020-03-07 15:24:37 · 484 阅读 · 1 评论 -
快速幂算法原理和求解过程
数的快速幂快速幂算法可以在O(logn)时间内完成对一个数求k次幂的操作。用了分治的思想,比如想要求a的20次方,则只需求一次a的10次方,然后在相乘即可。递归方法求解此方法较为直观。int pow1(int a,int k){ if(k==0) return 1; else{ if(k%2) return a*pow(a,k-1); else{ int tmp=pow(...原创 2019-10-29 17:37:33 · 496 阅读 · 0 评论 -
dijkstra算法针对稠密图和稀疏图的两种不同策略
迪杰斯特拉(dijkstra)算法是一种普遍用于求两点之间(或者说一个给定点到图中其他任意点)的最短路径的算法。但当图的连接较为稠密或者较为稀疏的时候,采用两种不同的思路,可以优化算法的执行速度。应用于稠密连接图的dijkstra算法所谓稠密连接就是指图之间的连接路径趋近于n的平方(n为图中节点的个数)。在稠密连接的条件下,dijkstra算法的算法复杂度是O(n^2)。算法思想是分两步走:...原创 2019-10-15 01:00:18 · 2743 阅读 · 0 评论 -
数据结构学习笔记------红黑树(附c++代码)
目录:1、 红黑树简介2、 左旋和右旋操作3、 添加节点操作4、 删除节点操作1、红黑树简介红黑树是二叉查找树的一种,其增删改查的统计性能要优于AVL树,查找、插入、删除算法的复杂度都为O(log(n))。先附上红黑树这种数据结构的性质:性质1、节点是红色或黑色。性质2、根节点是黑色。性质3、每个叶节点(是指的空节点,nil节点)是黑色的。性质4、每个红色节点的两个子节点都是黑...原创 2018-11-21 11:10:13 · 414 阅读 · 0 评论 -
数据结构学习笔记------并查集(附cf例题)
并查集是将原始的数据集S看成一个森林,每棵树代表一个集合。初始时,每个数据看成一颗只有根节点的树,根据具体要求,将若干树合并起来组成若干个含有节点较多的树,每棵树就是一个集合。此数据结构可以方便的对数据集S进行:(1)查找其属于哪个集合(2)将一个集合合并到另一个集合的操作。要注意的是,为了查找方便,所以属于同一集合的节点应该连接到同一根节点,这样就避免了迭代查找造成的时间浪费,所以在合并集合的时...原创 2018-11-17 14:44:54 · 307 阅读 · 0 评论