Tag: 算法

如何将循环转换为数学方程式?

我的程序中有以下两个循环,我正在尝试将它们写成数学方程式,但是我很难找到一个简洁的方法来执行此操作: // Loop1 for (int i = 0; i < nr; i++) { array[i] = nepr; } // Loop2 for (int i = 0; i < (nvr % nr); i++) { array[i]++; } 代码完全是函数,但我试图在我正在编写的文档中表达这些循环。 任何帮助将非常感谢。 到目前为止我有这个: array[i] = nepr, i = 0,…,(nr-1) 但是我不确定如何将第二个循环结合到等式中,或者为它写出第二个等式。

Dijkstra有一堆。 放松后如何更新堆?

我正在尝试实现Dijkstra算法。 foreach distance d d = INFINITY d[source] = 0 create_heap_based_on_Distances(); while(true) bestedge = heap[0] remove_minimum_from_heap //it will be heap[0] foreach adjacency of bestedge if (weight + bestedge_distance < current_distance) { current_distance = weight + bestedge_distance // Now I have to update heap, how can I do that? } if (heap_empty) break 所以,在放松的过程中,我如何更新堆,以便它具有正确的顺序? 我在该步骤中没有该节点的堆索引。 这是否意味着我必须创建一个新的数组,如nodes[edge] […]

如何实现n元素的搜索和插入操作的动态二进制搜索

根据n的二进制表示,我们的想法是使用多个长度为2 ^ k的数组来存储n个元素。每个数组都被排序,不同的数组不以任何方式排序。 在上述数据结构中,SEARCH通过每个arrays上的二进制搜索序列来执行。 INSERT由相同长度的数组的合并序列执行,直到到达空数组。 更多细节:假设我们有一个长度为2 ^ k的垂直数组,并且该数组的每个节点都附加了长度为2 ^ k的水平数组。 也就是说,对于垂直arrays的第一节点,连接长度为2 ^ 0 = 1的水平arrays,对于垂直arrays的第二节点,连接长度为2 ^ 1 = 2的水平arrays,依此类推。 因此,首先在第一水平arrays中执行插入,对于第二插入,第一arrays变为空并且第二水平arrays充满2个元素,对于第三插入第一和第二arrays水平。 数组被填充等等。 我实现了搜索的常规二进制搜索并插入如下: int main() { int a[20]= {0}; int n, i, j, temp; int *beg, *end, *mid, target; printf(” enter the total integers you want to enter (make it less then 20):\n”); scanf(“%d”, &n); if […]

嵌入式系统C中最快的arrays查找算法?

假设我有一个定义大小为22的常量浮点数,如下所示: array[0]= 0; array[1]= 0.5; array[2]= 0.7; array[3]= 1.8; … … array[21]= 4.2; 这个数组的值是单调的,也就是说,它们总是随索引而增加(array [0] <= array [1] <= array [2] <= …. <= array [21])。 我想要一个给定一个浮点数的函数,它找到数组的索引,其值正好在输入浮点数之下(因此,下一个索引的值紧接在上面) 例如,在前一种情况下,如果函数的输入值为0.68,则函数的输出应为1,因为数组[1] <= 0.68 现在,这很容易实现,但我正在处理嵌入式系统中代码的一个非常时间关键的部分,我真的需要一个非常优化的算法,它避免了循环(以避免开销)。 我现在使用的最简单的方法就是用if-elses展开循环,就是这样。 例: if(input >= array[size-1]) return size-1; else if(input>= array[size-2]) return size-2; else if(input >= array[size-3]) return size-3; … … 但这里的问题是我有抖动,因为不同输入的路径需要明显不同的时间。 所以我的问题是:是否有最快,更确定(更少抖动)的方式来实现它? 谢谢。 乔治。

指向结构和自我指针的指针

结构中的自引用指针和结构指针之间有什么区别? struct abc { int data; struct abc *next; } struct abc *pt; *next和*pt之间有什么区别? 他们的使用方式有何不同? 我对这两者之间的确存在疑问 我是初学者 第一个例子主要用于链表 指向结构节点和自引用指针的指针是一回事吗? 请参阅 see-programming.blogspot.in/2013/05/chain-hashing-separate-chaining-with.html这里我们使用struct hash * hashTable作为数组..how ?? 我们可以用* pt做同样的事吗

最常见的子序列:为什么这是错的?

int lcs(char * A, char * B) { int m = strlen(A); int n = strlen(B); int *X = malloc(m * sizeof(int)); int *Y = malloc(n * sizeof(int)); int i; int j; for (i = m; i >= 0; i–) { for (j = n; j >= 0; j–) { if (A[i] == ‘\0’ || […]

C – 使用后序遍历释放二叉树的内存

我想使用后序遍历删除二叉树 。 这意味着应首先删除树的左侧部分, 然后删除右侧的树,然后在后面的第二个函数中删除整个树并释放内存 。 我不允许更改函数的参数,只能使用它的内部: #include #include #include #include “telefonbuch.h” static inline bstree * create_node(unsigned long phone, char * name) { bstree * newNode = (bstree *) malloc(sizeof(bstree)); newNode->key.phone = phone; strcpy(newNode->key.name, name); newNode->left = NULL; newNode->right = NULL; return newNode; } void bst_insert_node(bstree * bst, unsigned long phone, char * name) { if […]

近似保序霍夫曼码

我正在为算法和数据结构类工作。 我无法理解给出的指示。 我会尽力解释这个问题。 给出的输入是正整数n,后跟n个正整数,表示有序字符集中符号的频率(或权重)。 第一个目标是构造一个树,该树为有序字符集的每个字符提供近似保持秩序的霍夫曼代码。 我们要通过“贪婪地合并权重最小的两棵相邻树木”来实现这一目标。 在分配中,我们示出了通过首先将权重插入优先级队列来构造传统的霍夫曼代码树。 然后通过使用delmin()函数从优先级队列中“弹出”根,我可以获得频率最低的两个节点,并将它们合并为一个节点,其左侧和右侧是这两个最低频率节点,其优先级为其子女的优先事项总和。 然后将此合并节点插回到最小堆中。 重复该过程,直到合并了所有输入节点。 我使用大小为2 * n * -1的数组实现了这个,输入节点从0 … n -1开始,然后从n … 2 * n * -1作为合并节点。 我不明白如何贪婪地合并权重最小的两棵相邻树。 我的输入基本上被组织成一个小堆,从那里我必须找到具有最小总和的两个相邻节点并合并它们。 通过相邻,我认为我的教授意味着他们在输入中彼此相邻。 示例输入: 9 1 2 3 3 2 1 1 2 3 然后我的min-heap看起来像这样: 1 / \ 2 1 / \ / \ 2 2 3 1 / \ 3 […]

在使每个索引具有与任何索引相同的概率的同时对数组进行混洗

我想改组一个数组,并且每个索引都有相同的概率在任何其他索引中(不包括它自己)。 我有这个解决方案,只有我发现总是最后2个索引总是相互交换: void Shuffle(int arr[]. size_t n) { int newIndx = 0; int i = 0; for(; i > n – 2; ++i) { newIndx = rand() % (n – 1); if (newIndx >= i) { ++newIndx; } swap(i, newIndx, arr); } } 但最终可能会有一些指数再次回到第一位。 有什么想法吗? C lang。

现在查找N天的日期

我正在寻找一种算法来查找未来一天的日期,这是从今天开始的N天。 我的主要问题是如何处理中间的闰年。