我有一堆符号,例如#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/types.h>
#include <string.h>
int
main()
{
/*...declarations and stuff....*/
scanf("%s",inputString);
length=strlen(inputString);
for (i=0;i<27;i++)
{
pid[i]=fork();
if (pid[i]==0)
{
/*...Declare my character...*/
while (1)
{
pause();
sleep(1);
printf("%c",myChar);
kill(ppid,SIGCONT);
}
return 0;
}
}
for (i=0;i<length;i++)
{
int temp=inputString[i];
if (temp==32)
{
kill(pid[0],SIGCONT);
}
else
{
kill(pid[temp-96],SIGCONT);
}
pause();
}
for(i=0;i<27;i++)
kill(pid[i],SIGTERM);
return 0;
}
和一个数据集。我需要计算每个组合出现的次数,例如{A, B, C, ....}
。符号的数量最多可以达到100个或更多。但是很多组合都没有出现。
我可以使用{AB, AC, ..., ABC, ..., BC, ...}
的第一个解决方案,但我认为这会浪费内存。我可以使用的第二个解决方案是trie,它们共享前缀。第三种解决方案可以是一棵树,但是每个符号需要一棵树。我不知道它是否比特里更好。
那么您有什么建议吗?
答案 0 :(得分:0)
从我认为的评论中,您说的是您需要按大小递增的顺序枚举子集。一种方法是简单的递归:
#include <stdio.h>
#include <string.h>
char set[] = "ABCD";
char buf[100];
void e(char *s, int len, int size, int p) {
if (size == 0) {
buf[p] = '\0';
printf("{%s}\n", buf);
return;
}
for (int i = 0; i <= len - size; ++i) {
buf[p] = s[i];
e(s + i + 1, len - i - 1, size - 1, p + 1);
}
}
int main(void) {
int len = strlen(set);
for (int size = 0; size <= len; ++size) e(set, len, size, 0);
return 0;
}
这里是奔跑:
$ ./foo
{}
{A}
{B}
{C}
{D}
{AB}
{AC}
{AD}
{BC}
{BD}
{CD}
{ABC}
{ABD}
{ACD}
{BCD}
{ABCD}
还有其他几种方法。如果您希望设置大小为其他顺序,则此方法仍然是一个不错的起点。