Tag: 算法

快速实现大整数计数器(在C / C ++中)

我的目标如下, 生成连续值,以便之前从未生成每个新值,直到生成所有可能的值。 此时,计数器再次启动相同的序列。 这里的要点是, 所有可能的值都是在不重复的情况下生成的(直到周期耗尽)。 如果序列是简单的0,1,2,3 ……,或者以其他顺序,则无关紧要。 例如,如果范围可以简单地用unsigned表示,那么 void increment (unsigned &n) {++n;} 足够。 但是,整数范围大于64位。 例如,在一个地方,我需要生成256位序列。 一个简单的实现如下,只是为了说明我想要做的事情, typedef std::array ctr_type; static constexpr uint64_t max = ~((uint64_t) 0); void increment (ctr_type &ctr) { if (ctr[0] < max) {++ctr[0]; return;} if (ctr[1] < max) {++ctr[1]; return;} if (ctr[2] < max) {++ctr[2]; return;} if (ctr[3] < max) {++ctr[3]; […]

二分匹配

如何在C或C ++中实现二分匹配算法(可能基于最大流算法)? 具体来说,我把这个输入放在一个文件中:(1,3)(1,5)(2,5) (M,F) – >其中M代表MALE的id,F代表FEMALE的id。 我需要找到最大匹配数并显示匹配的夫妻。 喜欢:匹配:1&3,2和5 我已经读过一些书籍,我可以将这个问题建立在“网络中的最大流量”算法上,但除了句子“这个问题可以通过……算法解决”之外,我找不到任何具体的信息。 我对max-flow知之甚少,也不知道如何实现它…

对超过2种类型的查询使用延迟传播

我有一个问题,有很多查询,有四种类型: 添加到范围。 初始化范围。 用标量乘以范围。 查找范围内的运行总和。 由于查询数量巨大,我必须使用具有延迟传播的分段树,但我仍然坚持如何在超过2种类型的查询上使用延迟传播。 如何在以后进行更新时识别出哪种更新(即添加,乘法,初始化)?

了解TCP校验和function

我相信TCP校验和function执行以下操作: 将伪头和TCP段头和数据分解为2个字节块。 如果长度不是2个字节,则在最后一个块的末尾添加一个0字节的填充,以使其为2个字节。 获取总和的一个补码以获得TCP校验和。 听起来很简单。 因此我编写了自己的通用checksum函数: #include #include uint16_t checksum(uint16_t * data, int size) { uint16_t sum = 0; int i = 0, length = size / 2; while (i < length) sum += data[i++]; if (size % 2) sum += data[i] & 0xFF00; return htons(~sum); } 然而,其他人写的checksumfunction似乎更复杂。 例如: uint16_t checksum(uint16_t * addr, int len) […]

如何接受一组数字,如{301,102,99,202,198,103}并扔掉~100?

可能重复: 从潜在谐波确定基频的算法 如果您正在考虑投票以结束此问题,请先抓住您的马并查看评论。 我回过头来计算一组谐波的基频,其中一些谐波丢失了。 我正在做的是查看相邻谐波之间的间隙。 我会得到一组数字,例如: pH(1): (1,2) -> 107.410568 pH(2): (2,3) -> 111.918732 pH(3): (3,4) -> 219.100800 pH(4): (4,5) -> 106.097473 pH(5): (5,6) -> 113.122009 pH(6): (6,7) -> 112.224731 pH(7): (7,8) -> 124.215942 从这里我需要计算一个基础。 在这种情况下,~110。 有一个额外的问题,有时一个特定的谐波会出来,例如: pH(1): (1,2) -> 107.376312 pH(2): (2,3) -> 135.100433 pH(3): (3,4) -> 86.590515 pH(4): (4,5) -> 111.350891 pH(5): (5,6) […]

实现BlackList的最有效方法

我正在开发一个Ipfilter并猜测我如何使用任何类型的esque数据结构,开发出非常高效和快速的BlackListfilter。 我想要做的是简单,每个传入/传出连接我必须检查被阻止的IP列表。 IP是分散的,内存使用应该是线性的(不依赖于阻塞列表的数量,因为我想在有限的系统(自制路由器)上使用)。 我有时间,可以从零创建任何东西。 困难对我来说并不重要。 如果你可以使用任何东西,你应该怎么做?

列出所有排列的代码的时间复杂度?

例如,如果输入字符串是“ABC”,则输出应为“ABC,ACB,BAC,BCA,CAB,CBA”。 这是我的方法: #include #include #include void print(char str[],int visited[],int index,char temp[],int len) { if(index==len) { temp[index]=’\0′; printf(“\n%s”,temp); return; } for(int i=0;i<len;i++) { if(!visited[str[i]-'A']) { visited[str[i]-'A']=1; temp[index]=str[i]; print(str,visited,index+1,temp,len); visited[str[i]-'A']=0; } } } int main() { int visited[20]={0}; char temp[20]; char str[] = "ABCD"; int len=strlen(str); print(str,visited,0,temp,len); getch(); return 0; } 我已经使用了一个访问过的数组来避免重复字符。 这段代码的复杂性是什么?

查找数组中数字的所有可能排列

我有一个数组包含让我们说[25,15,8,20]我想找到所有可能的数字排列。 预期产量: 25 15 8 20 25 15 20 8 25 20 15 8 25 20 8 15 25 8 20 15 25 8 15 20 15 25 8 20 15 25 20 8 15 20 25 8 15 20 8 25 15 8 20 25 15 8 25 20 20 25 15 8 20 […]

递归函数的输出不正确,以计算数字的位数之和

我试图编写一个函数来计算使用递归的数字的总和,但输出是不正确的。 这是代码: /*Write a function to calculate sum of digits of a number using recursion*/ /*Author:Udit Gupta Date:10/08/2011*/ #include int sum (int); int main () { int n,s; printf (“Enter the number:”); scanf (“%d”,&n); s = sum (n); printf (“The sum of the digits of the number is %d”,s); } int sum (int a) { […]

计算相邻矩形的数量

我的代码在[0,1]范围内的2D空间中打印一组(X,Y)坐标。 void Rect_Print() { cout << "In counter-clockwise fashion" << endl; cout << "#Rectangle ( x0, y0) ( x1, y1) " << endl; for (int b=0; b<Rect_Count; b++) { double Area = (Rect[b].x0 – Rect[b].x1) * (Rect[b].y0 – Rect[b].y1); cout << fixed << setprecision(4) << (b+1) << " (" << Rect[b].x0 << "," << Rect[b].y0 […]