算法
文章平均质量分 72
fanged
这个作者很懒,什么都没留下…
展开
-
音视频的Buffer处理
最近在做安卓下UVC的一个案子。正好之前搞过ST方案的开机广告,这个也是我少数最后没搞成功的项目。当时也有点客观原因,当时ST要退出机顶盒市场,所以一切的支持都停了,当时啃他家播放器几十万行的代码,而且几乎没有文档,真的是非常痛苦。后面虽然功能是搞出来了,但是不稳定,持续几次后就会crash。还记得当时最后到底层ST是用的滑动窗口缓存,双指针,一个写指针和一个读指针,当时我做了一个管道往缓存中注数据。主要就是共享内存,滑动窗口,双缓冲,环形缓冲这些内容。就是两个buffer,一个读一个写,写完之后交换。原创 2024-06-20 14:20:23 · 578 阅读 · 0 评论 -
线程池的思考
但是这样做有一个问题就是占用CPU资源,sleep的时候占用了CPU资源,而用pthread_cond_wait可以不占用CPU。2 任务怎么来管理,是不是一定要做任务队列。我自己做的第一版没这个,就会出现如果线程全忙,那么多的任务只有丢弃。所以任务队列是需要的。很多网上的代码,都是互斥体和条件变量一起用。为什么要用条件变量,我开始是真的没想明白。有一说一,线程池其实在国内用的不多。就算是C底层的程序员,用线程池也很少。查了一下GPT,说是防止虚假唤醒,多处理器场景。回来想想,这个还是单个任务的思路。原创 2024-02-15 22:50:41 · 93 阅读 · 1 评论 -
卡尔曼滤波小结
最近再接触卡尔曼滤波是因为一个声源定位库,Open embeddeD Audition System,它里面有两个部分,一个是定位,一个是跟踪。第二次更新:计算权重 :22.5/(22.5+25) = 0.47,预计状态:50.13+0.47(48.44−50.13)=49.33米,更新估计方差:(1−0.47)*22.5=11.84。第一次更新:计算权重 :225/(225+25) = 0.9,预计状态:60+0.9(49.03−60)=50.13米,更新估计方差:(1−0.9)*225=22.5。原创 2024-03-31 11:34:11 · 105 阅读 · 0 评论 -
动态规划的实践(1)
F(10) = F(9) + F(8),想一想也很好理解。F(9)到F(10)只有1步的走法,没有其它的选择。F(8)到F(10)也只有2步的走法,没有其它的选择。我也是刚学动态规划,感觉动态规划能干的事情,其实很多其它算法也能写出来,那么DP的优点在哪呢?我第一步想到的解法是递归,按照这个思路,其实很快就有答案。第二就是动态规划和树的感觉比较接近,我接触的几个都可以用递归来处理,都存在可以剪枝的优化。一个是从头开始,一个是倒着开始。但是毕竟这个题是有关动态规划的,详细看了下动态规划的思路。原创 2023-12-27 01:16:49 · 334 阅读 · 1 评论 -
递归用法总结(二叉树深度为例)
但是面临一个问题,就是当前层数和最大层数,必须要使用全局变量来记录,而在leetcode中,全局变量没法再初始化,所以就不可用。想破脑袋也没想出来怎么解决,后面求助了chatgpt,给的代码也是有这两个全局变量。从最底层开始计数,想来也是非常合理的,其实递归的本质或者从动态规划来说,也是应该自底而上,这样才能拆成更小的独立问题。如上面的二叉树,在3的时候是层1,9的时候就是层2,如果返回了层数就-1,然后使用一个变量记录最大值。提交上去看了下,可以通过但是成绩也不是很理想,应该可以加个字典什么的缓存一下。原创 2023-12-30 03:57:12 · 468 阅读 · 0 评论 -
查找循环链表(leetcode 141)
malloc的内存是在堆上分配,而且是从下往上,如果新的malloc内容,一般来说地址都在更高位。个人觉得这种方法还是太投机了,leetcode这边是按照顺序分配,但是谁能保证其它情况后面的节点就一定是后分配内存呢?一开始我的想法很简单,做一个循环,然后把之前遇到过的地址放在一个数组中,遇到新的地址就和之前的数组比对,看是否存在,如果存在,则返回true。就是判断新的节点地址是否小于之前节点,如果是,则存在闭环。一开始不好理解,但是如果循环是一个圈,那么快指针没多久就会回来,和慢指针重合,检测到闭环。原创 2024-01-02 04:19:03 · 350 阅读 · 0 评论 -
算法矩阵提速原理
其实就我来看,计算机懂个P的高等数学,什么线性代数,概率,微积分,对于计算机来说都没有意义,没有意义,没有意义。但是在实践中,很多算法一旦上了矩阵,就跟开了外挂一样,速度飞快,这个又是什么原因呢?这里又要说说图形,音视频的数据的一些特点了,这些数据就是矩阵运算的最好示范,现在的CPU架构中,为了加速这些运算,所以进行了很多特别的优化,比如超线程,SIMD等等。简而言之,在现在的CPU体系中,使用矩阵运算,可以更贴近现在的架构,比如Cache的结构,SIMD的指令集以及一些其它指令集。所以会觉得速度很快。原创 2024-04-22 14:52:00 · 473 阅读 · 0 评论 -
线性代数的一些理解(更新中)
设 𝑥(𝑡) 表示车辆在时间 𝑡t 时的位置。其中,第一个矩阵是转移矩阵 𝐴,它将 𝑥(𝑡𝑖)映射到 𝑥(𝑡𝑖+1);其中,𝑥(𝑡) 表示车辆在时间 𝑡t 时的位置(单位:米),𝑡 表示时间(单位:秒),2𝑡 表示车辆在时间 𝑡t 时已经行驶的距离。其中 𝑥(𝑡𝑖)表示车辆在时间 𝑡𝑖ti 的位置,𝑥(𝑡𝑖+1) 表示车辆在时间 𝑡𝑖+1 的位置,𝑣 表示车辆的速度。每个时间步长的长度为 Δ𝑡=𝑡𝑓−𝑡0𝑁。我们可以将位置 𝑥(𝑡)视为一个列向量,时间 𝑡 视为一个标量,速度 𝑣 视为一个常数。原创 2024-05-11 03:14:21 · 216 阅读 · 0 评论