
算法
文章平均质量分 69
fanged
野生程序员。。。这里主要是一些学习笔记和心得。。。
注:标题带TODO的内容都是未完成,内容有可能不准确。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
时间轮算法
本文介绍了一种高效的时间轮算法(Timing Wheel)实现定时器管理。传统队列方式遍历所有任务效率低(O(N)),时间轮通过哈希表思想将任务分配到时间槽中(时间复杂度O(1))。核心实现包括:1)循环队列处理长时间任务;2)槽位计算和圈数管理;3)多线程安全操作。文中提供了Python实现代码,并给出槽数计算公式(槽数=最大延迟/时间粒度)和典型场景配置建议。该算法适用于网络心跳、游戏逻辑等需要高效定时任务的场景,通过合理设置时间粒度和槽数可显著提升性能。原创 2025-07-19 00:06:21 · 168 阅读 · 0 评论 -
KMP算法
很久之前,大概毕业一两年的时候,当时对写算法有点兴趣,于是自己写了一个strstr,用C写的,想破头也没什么特别的算法,最后也差不多是遍历,找到第一个字符后依次匹配。写了两天差不多完工,但是效率比当时MFC自带的函数查了非常远,大概好几倍吧。所以后面也放弃了这种自己写库函数的想法了。最近看leetcode,看到KMP算法,所以也想学一下。找了一个普通的txt文件,大概是2M多。找寻里面的NFC关键字。运行设备是树莓派5(4GB版本)。原创 2025-03-16 00:11:10 · 125 阅读 · 0 评论 -
Brian Kernighan算法
最近看到一个题,就是算一个int里面有多少个1。这个还是挺常用的,也不难,就是判断最后一位是不是1,然后移位,很快就能给答案。二进制是110,那么-1就是101,再&之后就是100(4)。仔细看看这个什么意思呢,关于位操作,之前其实写过一篇。之后-1就是011,再&之后就是000。其中关键的就是这句n &= (n - 1);相比以前要硬循环31次,确实巧妙了一些。主要是内存用的不是很好。也就是n = n & (n - 1);只有两个位都是1时,结果位才是1。本质就是跳过了0,每次只处理1。原创 2025-03-15 18:27:33 · 209 阅读 · 0 评论 -
关于浮点数的小结
这里只写32位单精度浮点数。。。原创 2025-01-27 03:24:32 · 408 阅读 · 0 评论 -
车牌识别1
本来是可以用esp32 cam来做,后面想了想还是在linux上弄吧。终于,最近几天把树莓派的摄像头打通了。看了下这篇的TODO是二月就做了,但是一直拖到现在10月。也就是一个关键的前置摄像头那块没打通,所以这边也block了。里面还用了个pytesseract的库,看介绍说这个是用来做OCR的,好吧,我也是第一次用这个。我想原因是第一这个代码不支持汉字,第二还是要用深度学习来做这题才行。最好的时候88888能认出来,但是其它的就惨不忍睹了。网上找了一个炫酷车牌。原创 2024-02-07 02:31:21 · 228 阅读 · 1 评论 -
JPG压缩
以下是一个简单的JPEG压缩算法的示例代码,展示了压缩图像的基本过程。该代码基于Python和Pillow库,并利用了基本的DCT和量化。Pillow是Python中较为基础的图像处理库,主要用于图像的基本处理。下面是一个python版本的例子,该例子只能处理灰度图哈,量化矩阵的选择会影响压缩质量和压缩比。逆DCT变换:对反量化后的系数应用逆DCT变换。量化:使用量化矩阵对DCT系数进行量化。反量化:对量化后的DCT系数进行反量化。组合图像:将处理后的块组合回原图像。先发一个python版本。原创 2024-03-31 11:33:38 · 156 阅读 · 0 评论 -
线性回归求解
最小二乘法和梯度下降算法在目标和应用上有所区别,理解它们的关系和差异,有助于选择合适的方法解决具体问题。1是平方计算可导,更加方便。代入总成绩 X=450X = 450X=450,Y = 14.49+0.1325×450=14.49+59.625=74.115。这个基本上算是目前机器学习的基石了,说起来也算是高中的知识范围,我不知道是不是人人都懂了,我觉得我不是很懂,所以专门写一篇来总结总结。上面的过程基本不算难,就是回归系数的推算,看了下是最小二乘法。其中,XXX 是自变量矩阵,YYY 是因变量向量。原创 2024-07-14 16:20:36 · 557 阅读 · 0 评论 -
e的意义。
这里再说说对数,如果a的x次方等于N,那么数x叫做以a为底N的对数(logarithm),记作x=logaN。ln是e为底,那么就是loge,也就是e的多少次方等于多少。不过这里不是这个,是说的数学上那个e,写这个也挺尴尬的。在计算机发明以前,在欧美使用非常多,据说在曼哈顿计划中的工程师,人人都要带一个对数尺用来方便计算。然后绕不开的就是一个ln,这个是一个以e为底的对数,也就是自然对数。logn 表示对数函数,即如果一个算法的时间复杂度为 O(logn),意味着算法的运行时间与输入规模的对数成正比。原创 2024-07-09 23:27:35 · 291 阅读 · 0 评论 -
音视频的Buffer处理
最近在做安卓下UVC的一个案子。正好之前搞过ST方案的开机广告,这个也是我少数最后没搞成功的项目。当时也有点客观原因,当时ST要退出机顶盒市场,所以一切的支持都停了,当时啃他家播放器几十万行的代码,而且几乎没有文档,真的是非常痛苦。后面虽然功能是搞出来了,但是不稳定,持续几次后就会crash。还记得当时最后到底层ST是用的滑动窗口缓存,双指针,一个写指针和一个读指针,当时我做了一个管道往缓存中注数据。主要就是共享内存,滑动窗口,双缓冲,环形缓冲这些内容。就是两个buffer,一个读一个写,写完之后交换。原创 2024-06-20 14:20:23 · 758 阅读 · 0 评论 -
线程池的思考
但是这样做有一个问题就是占用CPU资源,sleep的时候占用了CPU资源,而用pthread_cond_wait可以不占用CPU。2 任务怎么来管理,是不是一定要做任务队列。我自己做的第一版没这个,就会出现如果线程全忙,那么多的任务只有丢弃。所以任务队列是需要的。很多网上的代码,都是互斥体和条件变量一起用。为什么要用条件变量,我开始是真的没想明白。有一说一,线程池其实在国内用的不多。就算是C底层的程序员,用线程池也很少。查了一下GPT,说是防止虚假唤醒,多处理器场景。回来想想,这个还是单个任务的思路。原创 2024-02-15 22:50:41 · 138 阅读 · 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 · 220 阅读 · 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 · 388 阅读 · 1 评论 -
递归用法总结(二叉树深度为例)
但是面临一个问题,就是当前层数和最大层数,必须要使用全局变量来记录,而在leetcode中,全局变量没法再初始化,所以就不可用。想破脑袋也没想出来怎么解决,后面求助了chatgpt,给的代码也是有这两个全局变量。从最底层开始计数,想来也是非常合理的,其实递归的本质或者从动态规划来说,也是应该自底而上,这样才能拆成更小的独立问题。如上面的二叉树,在3的时候是层1,9的时候就是层2,如果返回了层数就-1,然后使用一个变量记录最大值。提交上去看了下,可以通过但是成绩也不是很理想,应该可以加个字典什么的缓存一下。原创 2023-12-30 03:57:12 · 684 阅读 · 0 评论 -
查找循环链表(leetcode 141)
malloc的内存是在堆上分配,而且是从下往上,如果新的malloc内容,一般来说地址都在更高位。个人觉得这种方法还是太投机了,leetcode这边是按照顺序分配,但是谁能保证其它情况后面的节点就一定是后分配内存呢?一开始我的想法很简单,做一个循环,然后把之前遇到过的地址放在一个数组中,遇到新的地址就和之前的数组比对,看是否存在,如果存在,则返回true。就是判断新的节点地址是否小于之前节点,如果是,则存在闭环。一开始不好理解,但是如果循环是一个圈,那么快指针没多久就会回来,和慢指针重合,检测到闭环。原创 2024-01-02 04:19:03 · 418 阅读 · 0 评论 -
算法矩阵提速原理
其实就我来看,计算机懂个P的高等数学,什么线性代数,概率,微积分,对于计算机来说都没有意义,没有意义,没有意义。但是在实践中,很多算法一旦上了矩阵,就跟开了外挂一样,速度飞快,这个又是什么原因呢?这里又要说说图形,音视频的数据的一些特点了,这些数据就是矩阵运算的最好示范,现在的CPU架构中,为了加速这些运算,所以进行了很多特别的优化,比如超线程,SIMD等等。简而言之,在现在的CPU体系中,使用矩阵运算,可以更贴近现在的架构,比如Cache的结构,SIMD的指令集以及一些其它指令集。所以会觉得速度很快。原创 2024-04-22 14:52:00 · 746 阅读 · 0 评论 -
线性代数的一些理解(更新中)
设 𝑥(𝑡) 表示车辆在时间 𝑡t 时的位置。其中,第一个矩阵是转移矩阵 𝐴,它将 𝑥(𝑡𝑖)映射到 𝑥(𝑡𝑖+1);其中,𝑥(𝑡) 表示车辆在时间 𝑡t 时的位置(单位:米),𝑡 表示时间(单位:秒),2𝑡 表示车辆在时间 𝑡t 时已经行驶的距离。其中 𝑥(𝑡𝑖)表示车辆在时间 𝑡𝑖ti 的位置,𝑥(𝑡𝑖+1) 表示车辆在时间 𝑡𝑖+1 的位置,𝑣 表示车辆的速度。每个时间步长的长度为 Δ𝑡=𝑡𝑓−𝑡0𝑁。我们可以将位置 𝑥(𝑡)视为一个列向量,时间 𝑡 视为一个标量,速度 𝑣 视为一个常数。原创 2024-05-11 03:14:21 · 382 阅读 · 0 评论