Tag: 算法

缩小位图字体的算法

这是这个问题的后续行动。 我正在开发一个低级别的C应用程序,我必须在其中绘制文本。 我决定存储我想用作数组的字体(黑色和白色,每个char 128×256,也许),然后我用一些算法将它缩小到我需要的尺寸(作为灰度,所以我可以有一些原油字体平滑)。 注意:这是一个玩具项目,请忽略诸如在运行时进行计算之类的事情。 问题是, 哪种算法? 我2xSaI了2xSaI ,但它相当复杂。 我想要一些我可以阅读描述并自己编写代码的东西(我是一名初学者,并且已经用C / C ++编写了不到一年的时间)。 建议,有人吗? 谢谢你的时间! 编辑:请注意,输入为B&W,输出应平滑灰度

如何使用C中的递归生成4位二进制组合0,1?

对于这个数组,尝试这样的事情: void rollover(int val,int count) { if(count==0) { return; } printf(“%d “,val); count–; rollover(val,count); } int main() { int arr[]={0,1}; for(int i=0;i<=1;i++) { rollover(arr[i],4); } printf("\n"); return 0; } 使用递归方法的预期输出: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 无法理解如何编写rec函数。 我花了几个小时来解决它。 有人可以协助编写该function吗? 我正在尝试做下面发布的G_G之类的事情。 我怎么能写这样的递归函数? 我是否必须使用一个for循环来调用递归函数,或者使用两个for循环来递归,还是应该调用两次递归函数? 例如: void rollover(int […]

马哈拉诺比斯距离反演协方差矩阵

我正在编写一个函数来获取两个向量之间的Mahalanobis距离。 我知道这是使用等式a’* C ^ -1 * b实现的,其中a和b是向量,C是协方差矩阵。 我的问题是,有没有一种有效的方法可以在不使用Gauss-Jordan消除的情况下找到矩阵的逆矩阵,还是没有办法解决这个问题? 我正在寻找一种方法来做到这一点,而不是任何预定义的function。 我知道C是一个Hermitian,正定矩阵,那么有什么方法可以算法利用这个事实呢? 或者是否有一些聪明的方法来计算Mahalanobis距离而不计算协方差的倒数? 任何帮助,将不胜感激。 ***编辑:上面的马哈拉诺比斯距离方程是不正确的。 它应该是x’* C ^ -1 * x,其中x =(ba),而b和a是我们试图找到的距离的两个向量(感谢LRPurser)。 因此,在所选答案中提出的解决方案如下: d = x’* b,其中b = C ^ -1 * x C * b = x,因此使用LU分解或LDL’因子分解来求解b。

改进malloc()算法的下一步是什么?

我正在编写自己的简单malloc()函数,我想创建更快更有效的变体。 我是使用线性搜索并在内存中顺序和连续分配的函数。 改进此算法的下一步是什么? 我当前版本的主要缺点是什么? 我将非常感谢任何反馈和建议。 typedef struct heap_block { struct heap_block* next; size_t size; bool isfree; }header; #define Heap_Capacity 100000 static char heap[Heap_Capacity]; size_t heap_size; void* malloc(size_t sz) { if(sz == 0 || sz > Heap_Capacity) { return NULL; } header* block = (header*)heap; if(heap_size == 0) { set_data_to_block(block, sz); return (void*)(block+1); } while(block->next != […]

转置2Darrays

你如何有效地转置矩阵? 是否有这样的库,或者你会使用什么算法? 例如: short src[W*H] = { {1,2,3}, {4,5,6} }; short dest[W*H]; rotate_90_clockwise(dest,src,W,H); //<– magic in here, no need for in-place //dest is now: { {4, 1}, {5, 2}, {6, 3} }; (在我的具体情况下,它的src数组是原始图像数据,目标是帧缓冲,我在ARM上嵌入了不支持汇编的工具链)

线性/非线性拟合到正弦曲线

我看过这个和这个 。 但我的问题略有不同。 我知道我的数据是一条正弦曲线,具有未知周期和未知幅度,具有加性非高斯分布噪声。 我试图在C中使用GSL非线性算法来拟合它,但是拟合非常糟糕。 我想知道我是否(错误地)使用非线性拟合算法,我应该使用线性算法? 如何判断特定数据集是否需要线性算法或非线性算法? 编辑:我的曲线非常嘈杂,因此使用FFT来计算频率可能会导致误报和错误拟合。 我正在寻找一种更健壮的贴合方式。 如您所见,上面的情节大约有170个点,下面的情节大约有790个点。 噪声明显是非高斯的,并且与数据的幅度相比较大。 我已经尝试过高斯分布式噪声的FFT,而且我很适合。 在这里,它的失败非常严重。 增加:链接到第一次系列数据。 文件中的每一列都是不同的时间序列。

减少整数分数算法

(这源于最近完成的编程竞赛) 您将获得两个10 ^ 5整数的数组,范围为1..10 ^ 7,包括: int N[100000] = { … } int D[100000] = { … } 想象一下,有理数X是将N的所有元素相乘并除以D的所有元素的结果。 修改两个数组而不更改X的值(并且不指定任何元素超出范围),使得N的乘积和D的乘积没有公因子。 一个天真的解决方案(我认为)会起作用…… for (int i = 0; i < 100000; i++) for (int j = 0; j < 100000; j++) { int k = gcd(N[i], D[j]); // euclids algorithm N[i] /= k; D[j] /= k; } […]

更快的16位乘法算法,适用于8位MCU

我正在寻找一种算法来乘以两个比下面更好的整数。 你有一个好主意吗? (MCU – AT Tiny 84/85或类似 – 此代码运行的地方没有mul / div运算符) uint16_t umul16_(uint16_t a, uint16_t b) { uint16_t res=0; while (b) { if ( (b & 1) ) res+=a; b>>=1; a+=a; } return res; } 当使用avr-gcc编译器为AT Tiny 85/84编译时,该算法几乎与avr-gcc生成的算法__mulhi3相同。 avr-gcc算法: 00000106 : 106: 00 24 eor r0, r0 108: 55 27 eor r21, r21 10a: 04 […]

在二叉树中查找共同的祖先

我在一次采访中向我询问了这个问题:我有一个二叉树,我必须找到该树的两个随机节点的共同祖先(父)。 我也得到了一个指向根节点的指针。 我的回答是: 分别遍历两个节点的树,直到到达预期的节点。 遍历时并行存储元素和链接列表中的下一个地址。 然后我们有两个链接列表。 因此,尝试比较两个链表,两个链表中的最后一个公共节点是父列表。 我认为这个解决方案是正确的,如果我错了,请纠正我。 如果这个解决方案是正确的,我可能知道这是这项任务的唯一更好的解决方案还是有比这更好的解决方案!

如何使用C查找数字中的前导零数

例如,如果我有64号,那么它的二进制表示将是0000 0000 0000 0000 0000 0000 0100 0000,因此零的前导数是25.记住我必须在O(1)时间内计算它。 请告诉我正确的方法。即使你的复杂性> O(1),请发表你的答案。 感谢名单