Tag: 算法

如何有效地检索数字的第一个十进制数字

一个明显的解决方案是 int n = 2134; while(n > 9) n /= 10; 这需要线性时间。 我们可以做得更快吗? 这比线性时间更快: char s[100]; sprintf(s, “%d”, n); n = s[0]-‘0’; 其他方式是什么(效率是主要关注点)? 我见过这个 ,除了我只需要找到第一个数字。 (另外,我不明白答案)。

多序列的最长公共子序列

为了找到M = 2序列最长的研究,我做了很多研究,但我想弄清楚如何对M≥2序列进行研究 我被赋予N和M:M序列,具有N个独特元素。 N是{1 – N}的集合。 我已经考虑过动态编程方法,但我仍然对如何实际合并它感到困惑。 输入示例 5 3 5 3 4 1 2 2 5 4 3 1 5 2 3 1 4 这里可以看到最大序列 5 3 1 预期产出 Length = 3

查找数组中的前n个最大元素

我有一个包含唯一元素的数组。 我需要以尽可能最小的复杂性找出数组中的前n个最大元素。 到目前为止,我能想到的解决方案具有O(n ^ 2)的复杂性。 int A[]={1,2,3,8,7,5,3,4,6}; int max=0; int i,j; int B[4]={0,0,0,0,};//where n=4; for(i=0;imax) max=A[i]; } B[0]=max; for(i=1;i<n;i++){ max=0; for(j=0;jmax&&A[j]<B[i-1]) max=A[j]; } B[i]=max; } 如果有人能想出一个更复杂的更好的解决方案,我将非常感激。 而且我不打算改变原来的arrays!

是否有可能进行有效的基于指针的二进制堆实现?

甚至可以使用指针而不是数组来实现二进制堆 ? 我搜索了互联网(包括SO),但没有找到答案。 这里的主要问题是,你如何跟踪最后一个指针? 将X插入堆中时,将X放在最后一个指针处,然后将其冒泡。 现在,最后一个指针指向哪里? 而且,当你想删除root时会发生什么? 您将根与最后一个元素交换,然后向下冒泡新根。 现在,您如何知道再次删除root时所需的新“最后一个元素”是什么?

libc随机数生成器有缺陷吗?

考虑一种算法来测试在特定次数的尝试之后从一组N个唯一数字中挑选某个数字的概率(例如,N = 2,轮盘中的概率是什么(没有0),它需要X尝试黑赢?) 对此的正确分布是pow(1-1 / N,X-1)*(1 / N)。 但是,当我使用下面的代码测试时,X = 31处始终存在深沟,独立于N,并且独立于种子。 这是一个内在的缺陷,由于PRNG的实施细节在使用中无法防止,这是一个真正的错误,还是我忽略了一些明显的东西? // C #include #include #include int array[101]; void main(){ int nsamples=10000000; double breakVal,diffVal; int i,cnt; // seed, but doesn’t change anything struct tms time; srandom(times(&time)); // sample for(i=0;i<nsamples;i++){ cnt=1; do{ if((random()%36)==0) // break if 0 is chosen break; cnt++; }while(cnt<100); array[cnt]++; } // […]

在MXN矩阵中查找amxn子矩阵的最快方法

我在考虑一种快速的方法来在更大的矩阵M中寻找子矩阵m。我还需要识别部分匹配。 我能想到的几种方法是: 优化正常的暴力,只处理增量的行和列。 可能会将Rabin-karp算法扩展到2-d但不确定如何处理它的部分匹配。 我相信这是图像处理中经常遇到的问题,如果有人可以投入他们的意见或指向我关于这个主题的资源/论文,我将不胜感激。 编辑:较小的例子: 更大的矩阵: 1 2 3 4 5 4 5 6 7 8 9 7 6 5 2 较小的矩阵: 7 8 5 2 2 结果:(行:1列:3) 较小矩阵的一个例子,它在(1,3)处有资格作为部分匹配: 7 9 5 2 2 如果超过一半像素匹配,则将其视为部分匹配。 谢谢。

为什么我们需要在C中的字符数组末尾添加’\ 0’(null)?

为什么我们需要在C中的字符数组末尾添加’\ 0’(null)? 我在K&R 2(1.9字符数组)中读到过它。 书中找到最长字符串的代码如下: #include #define MAXLINE 1000 int readline(char line[], int maxline); void copy(char to[], char from[]); main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while ((len = readline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) printf(“%s”, […]

找到给定数字因子的算法..最短方法?

找出给定数字的因子可能是最简单和最有效的逻辑。 是否存在基于相同的算法。 实际上,我真正的问题是找出答案。 对于给定数字存在的因素.. 所以任何算法,请告诉我这个.. 谢谢。

在两个不同大小的数组中查找公共元素

我有一个问题是在两个数组中找到不同大小的公共元素。 取大小为n数组A1和大小为m数组A2 , m != n 到目前为止,我已经尝试逐个迭代列表并将元素复制到另一个列表。 如果元素已经包含标记,但我知道它不是一个好的解决方案。

如何编写一个C程序来检查一个点是否位于一个正方形内,给定一个对角线的端点

我正在解决上面提到的问题但是对数学方程和变量太过困惑了。 我开始尝试找到另外两个点的坐标,但是方程式无法由我解决,存在很多变量,我感到困惑。 如果这已经完成,我会尝试检查关于两侧的点的位置,但这也包括很多变量和混乱。 一个好的算法可能会有所帮助。 谢谢!