用于计算组合出现次数的数据结构

时间:2019-12-03 06:25:43

标签: data-structures

我有一堆符号,例如#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,它们共享前缀。第三种解决方案可以是一棵树,但是每个符号需要一棵树。我不知道它是否比特里更好。

那么您有什么建议吗?

1 个答案:

答案 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}

还有其他几种方法。如果您希望设置大小为其他顺序,则此方法仍然是一个不错的起点。