
数据结构与算法
文章平均质量分 84
rayylee
awk 'BEGIN{O="o"~"o";o="O"=="O";O+=+o;o_+=o""o;for(;++_o!=o_-O;)O_=O_"%c";printf(O_,o_*(o_-o)+O+O,o_*(o_-O)-O,o_*o_,o_*o_,o_*(o_-o)-O,o_*(o_-O)+O,o_*(o_-O)+O,o_-o)}'
展开
-
基于LQR算法的一阶倒立摆控制
(F为外力,x为物块位移,M,m为物块和摆杆的质量,φ为摆杆相对竖直向上方向的角度)倒立摆的受力分析网上有很多,这里就不再叙述。原创 2023-09-20 10:12:07 · 2277 阅读 · 1 评论 -
dpdk无锁队列rte_ring实现分析
rte_ring的实质是FIFO的无锁环形队列,无锁队列的出队入队操作是rte_ring实现的关键。常用于多线程/多进程之间的通信。ring的特点:无锁出入队(除了cas(compare and swap)操作);多消费/生产者同时出入队。原创 2023-02-03 18:01:59 · 1457 阅读 · 0 评论 -
比Linus更牛逼的程序员,QEMU、FFmpeg的作者
Linus Torvalds是个非常厉害的程序员,因为他有两个名扬天下的作品:Linux和Git。如果单论技术能力,有一个人,也许比Linus更强。我在看他主页项目列表的时候,感觉头都炸了。他开发了著名的模拟器QEMU和音视频处理库FFmpeg,仅仅是这两项就超越绝大部分程序员了,他还写过C编译器,OpenGL实现,LTE软基站,JS引擎,让Linux在浏览器中跑起来,甚至还创造了计算圆周率的世界纪录......原创 2022-11-04 19:32:05 · 3522 阅读 · 0 评论 -
LZ4压缩算法简介
lz77编码思想:它是一种基于字典的算法,它将长字符串(也可以称为匹配项或者短语)编码成短小的标记,用小标记代替字典中的短语,也就是说,它通过用小的标记来代替数据中多次重复出现的长字符串来达到数据压缩的目的。其处理的符号不一定是文本字符,也可以是其他任意大小的符号。............原创 2022-08-18 22:13:05 · 6536 阅读 · 2 评论 -
leetcode那些算法都用在了哪里
本文来源于一篇stackexchange的问题回答。提问者问到,我们在计算机科学和数学课程里面学习到的那些算法,到底在什么地方用到了?结果Vijay D给出一个洋洋洒洒的深入回答。Vijay D写到:在我看来,一个系统背后主要发挥作用的算法更容易在非算法课程上找到,这和应用数学中的成果比理论数学中更容易出现在应用中是一个道理。在讲座中,很少有实际问题能够精确匹配到一个抽象问题。归根结底,我认为没有理由让流行的算法课程,诸如Strassen乘法,AKS素性测试、或者Moser-Tardos算法与底层实际问原创 2021-10-23 12:02:52 · 321 阅读 · 0 评论 -
14种常用算法模式
下面列出最常见的 14 种算法模式,它们可被用于解决常见的问题。另外还会说明如何识别每种模式,并会为每种模式提供一些问题示例。1.滑动窗口2.二指针或迭代器3.快速和慢速指针或迭代器4.合并区间5.循环排序6.原地反转链表7.树的宽度优先搜索(Tree BFS)8.树的深度优先搜索(Tree DFS)9.Two Heaps10.子集11.经过修改的二叉搜索12. 前 K 个元素13. K 路合并14.拓扑排序1.滑动窗口滑动窗口模式是用于在给定数组或链表的特定窗口大小上执原创 2021-03-13 19:06:54 · 2815 阅读 · 0 评论 -
十大经典排序C++实现及动图演示
0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。0.2 算法复杂度0.3 相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。原创 2020-10-21 18:17:44 · 788 阅读 · 0 评论 -
圆形缓冲区(循环buffer)实现
用法圆形缓冲区的一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非圆形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,圆形缓冲区适合实现先进先出缓冲区,而非圆形缓冲区适合后进先出缓冲区。圆形缓冲区适合于事先明确了缓冲区的最大容量的情形。扩展一个圆形缓冲区的容量,需要搬移其中的数据。因此一个缓冲区如果需要经翻译 2016-05-20 18:05:00 · 19546 阅读 · 1 评论 -
二分法查找有序表中最接近的数值
二分查找(Binary Search): 二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。实例:二分法查找有序表中最接近的数值/** * 二分法查找递增表中最接近的数 * @return * - 数组下标 成功 * - -1 失败 */i原创 2016-05-24 15:28:04 · 5047 阅读 · 0 评论 -
digest 用户认证 response生成算法
response计算过程:1. HA1=MD5(A1)=MD5(username:realm:password) 2. a. 如果 qop 值为“auth”或未指定 : HA2=MD5(A2)=MD5(method:uri) b. 如果 qop 值为“auth-int" : HA2=MD5(A2)=MD5(method:uri:MD5(entity-body))原创 2016-04-28 16:15:50 · 3257 阅读 · 0 评论 -
基于Libevent最小根堆定时器的C++定时器实现
在libevent中定时器的实现是通过基于最小堆的优先级队列来实现的,对于这两个数据结构比较陌生的可以去翻算法导论的6.5节中,主要的源码都在min_heap.c中,下面是C++的实现。数据结构typedef struct min_heap{ struct event** p; unsigned n, a;} min_heap_t;在这个数据结构中 p也就是整个优先级队转载 2016-01-14 17:51:13 · 3884 阅读 · 0 评论 -
字符串哈希函数
基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了)。在处理大规模字符串数据转载 2015-03-18 14:29:24 · 493 阅读 · 0 评论 -
C/C++笔试经典——链表倒序
设链表节点为:typedef struct tagListNode{ int data; struct tagListNode* next;}ListNode, *List;要求将一带链表头List head的单向链表逆序。分析: 1). 若链表为空或只有一个元素,则直接返回; 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作转载 2014-07-03 17:15:16 · 6929 阅读 · 1 评论 -
数据结构之--冒泡排序的三种实现
冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码://冒泡排序1v转载 2014-07-05 09:33:07 · 1225 阅读 · 0 评论 -
linux内核之kfifo队列
1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送。为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区转载 2015-03-11 20:45:42 · 1212 阅读 · 2 评论 -
数据结构之红黑树
1. 简介红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高转载 2015-10-22 20:57:33 · 437 阅读 · 0 评论 -
hash表冲突处理方法
【from:http://blog.youkuaiyun.com/qll125596718/article/details/7028322】 为提高hash表查找性能,除了考虑选择合适的hash表表长和完美的hash函数外,还必须考虑hash表处理冲突的能力。当hash函数对两个不同的数据项产生了相同的hash值时,冲突就产生了。对于冲突的处理,通常采用的方法可以分为三类:(1)线性再散列法转载 2015-10-22 20:47:17 · 1251 阅读 · 0 评论 -
数据结构--堆
1.堆堆总是满足下列性质:● 堆中某个节点的值总是不大于或不小于其父节点的值● 堆总是一棵完全树将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。(ki 2i,ki <= k2i+1)或者(ki >= k2i,ki >翻译 2016-01-14 17:33:36 · 571 阅读 · 0 评论 -
常见排序算法小结
排序算法经过了很长时间的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合,很难通用。因此,我们很有必要对所有常见的排序算法进行归纳。我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆。比如下面这张图,我们将围绕这张图来思考几个问题。 上面的这张图来自一个PPT。它概括了数据结构中的所有常见的排序算法转载 2016-01-14 17:08:56 · 820 阅读 · 0 评论