Tag: 排列

通过使用递归确定两个数组是否相互置换

我在编写一个代码时遇到了一些困难,该代码通过使用递归来确定两个未排序的数组是否是彼此的排列。 我知道如何通过非递归代码确定它,使用排序 – 但我不知道如何通过使用递归来做到这一点。 到目前为止,我无法得到任何真正的想法…… int CheckPermutation(int arr1[], int arr2[], int size) { if (size == 0) return 1; if (size == 1) return (arr1[0] > arr2[0]); } 这就是我所尝试的,我发现很难从那一点继续

从输入的字符数组中找到所有可能的单词(排列)

阅读了几篇文章之后,我仍然对排列和递归函数感到难过。 我试图在不等长的2D数组中创建所有可能的3个字母排列,其中第一个字母来自集合{‘l’,’m’,’n’},第二个字母来自集合{‘q ‘,’r’}和第三个字母来自集合{‘a’,’e’,’i’,’o’}。 我的代码经过了正确的排列模式,但没有打印出正确的输出。 例如,如果前8个排列应该是: lqa lqe lqi lqo lra lre lri lro 我的代码打印出来: lqa e i o ra e i o 关于问题是什么的任何想法? 以下是我的代码的相关部分: rec(character_pools,0,3); void rec(char** pool, int k, int j) { if(k==j) { printf(“\n”); return; } int i,len=strlen(pool[k]); for (i=0;i<len;i++) { printf("%c",pool[k][i]); rec(pool,k+1,j); } }

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

我有一个数组包含让我们说[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 […]

如何使用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 […]

C将内存部件移动到位

我正在实现几个数据结构和一个我要使用的原语如下:我有一个内存块A [N](它有一个可变长度,但我的示例为100)并且在这个块中,有一个较小的部分长度为K的C(比方说30)我想要移动而不使用任何额外的内存。 另外的困难是,A“包裹”,即C可以从A [80]开始,然后C的前20个元素是元素A [80..100],最后10个元素是元素A [ 0..10]。 此外,目标范围还可以以任何可能的方式“包裹”并与C重叠。 另外,我不想使用超过一定数量的额外内存,一切都应该到位。 此外,既不在目标范围内也不在源范围内的A部分可能包含重要的内容,因此也不能使用。 所以一个案例如下: A看起来像这样: | 456789ABCDEF0123456789AB | —– | 0123 | 应该转变为: | 89AB | —– | 0123456789ABCDEF01234567 | 只是将它委托给一个库或者从库中使用另一个数据结构不是一个选项,我想自己理解这个问题。 在第一眼看来,我认为这可能不是微不足道的,但是一旦你区分了几个案例,它就会变得清晰,但现在我遇到了严重的麻烦。 当然,如果它们不重叠或不包装,则存在微不足道的情况,但至少如果两者同时发生,则会变得混乱。 你可以从一个自由的地方开始并移动属于那里的部分,然后你在其他地方创建另一个免费部分,很难跟踪你可以使用哪些部分。 也许我完全错过了一些东西,但即使我的特殊情况,如果目标范围没有包装也有近100行(虽然它的一半是断言和注释)我可以更新它以便它也处理一般情况下一些额外的索引计算,但如果有人有一个优雅而简短的解决方案,我将不胜感激。 直觉上我认为这应该是微不足道的,但我还没有看到最好的解决方案。 注意:有趣的情况当然是,如果C几乎和A一样大。如果| C | <N / 2,这是微不足道的。 编辑:使用超过一定量的额外标志/索引计数作为额外的内存,我想尽可能避免这种情况。 编辑:有些人想看我的代码。 我的问题相当抽象,所以我不想发布它,但也许有人看到了如何改进它。 这很糟糕,它只适用于目标从头开始(但是,可以很容易地改变)并且非常长的情况,但它可以在O(n)中没有额外的内存。 #include #include #include #include void move_part(int* A, size_t N, size_t target, size_t […]

随机置换单链表的N个第一个元素

我必须随机地置换长度为n的单链表的N个第一个元素。 每个元素定义为: typedef struct E_s { struct E_s *next; }E_t; 我有一个根元素,我可以遍历整个大小为n的链表。 什么是最有效的技术来随机置换N个第一个元素(从根开始)? 因此,给定a-> b-> c-> d-> e-> f – > … x-> y-> z我需要制作smth。 像f-> a-> e-> c-> b – > … x-> y-> z 我的具体案例: nN相对于n约为20% 我有限的RAM资源,最好的算法应该使它到位 我必须在循环中进行多次迭代,因此速度很重要 理想的随机性(均匀分布)不是必需的,如果它“几乎”是随机的,那就没关系 在进行排列之前,我已经遍历了N个元素(用于其他需求),所以也许我可以将它用于排列 更新:我发现了这篇论文 。 它声明它提出了一个O(log n)堆栈空间和预期的O(n log n)时间的算法。

生成数字组合而不重复的算法

我在这里检查了几乎所有类似的post,但我无法弄清楚我怎么能做我想要的。 我正在尝试的是在C程序中输入一个输入,比如说4号,程序在数组中返回以下数字: 1 2 3 4 12 13 14 23 24 34 123 134 124 1234 更清楚:如果输入数字是4,那么我想使用数字1-4并生成所有可能的数字组合(从1位组合到4位组合),没有数字重复。 我尝试了以下代码: #include /* Prints out a combination like {1, 2} */ void printc(int comb[], int k) { printf(“{“); int i; for (i = 0; i = 0) && (comb[i] >= n – k + 1 + i)) { […]

按字典顺序打印所有排列

我想以字典顺序打印字符串的所有排列。 我写这段代码: void permute(char *a, int i, int n) { if (i == (n-1)) printf(“\”%s\”\n”, a); else { for (int j = i; j < n; j++) { swap((a+i), (a+j)); permute(a, i+1, n); swap((a+i), (a+j)); } } } 我有例如字符串abc ,所以我希望以左列中的字典顺序接收所有排列,但是我的结果与右列相同。 “abc” “abc” “acb” “acb” “bac” “bac” “bca” “bca” “cab” “cab” 有人可以帮我弄这个吗? 我看到了一些算法,但看起来很难。 我想我可以在数组中保存所有生成的字符串,然后对这个数组进行排序,但是我不能写这个(我是C语言的初学者)。

用C打印字符串的所有排列

我正在学习回溯和递归,我坚持使用一种算法来打印字符串的所有排列。 我用置换算法求解了它,但是我无法理解递归方法。 我在网上搜索并找到了这段代码: void permute(char *a, int i, int n) { int j; if (i == n) printf(“%s\n”, a); else { for (j = i; j <= n; j++) { swap((a+i), (a+j)); permute(a, i+1, n); swap((a+i), (a+j)); } } } 这个算法基本上如何工作我无法理解? 我甚至试过干跑! 如何应用回溯? 它是否比贝尔算法更有效地计算排列?