C ++更快的char数组比较

时间:2014-02-15 10:48:53

标签: c++ arrays string performance compare


我想要做的是找到一种更快的方法来执行相同的程序,但执行得更快。

#include <cstdio>
#include <cstring>
int main ()

    {
        int br=0, c, n, b, e, i, q, g;
        char t[7000], a[7000];
        scanf("%d" ,&n);
        for (g=0; g<n; g++)  // number of test cases
        {
            scanf ("%7000s",&t);
            c=strlen(t);
            scanf ("%7000s",&a);
            b=strlen(a);
            for (i=0; i<b; i++)  // comparing them
            {
                for (q=0; q<c; q++)
                {
                    if (a[i]==t[q] && a[i]!='\0' && t[q]!='\0')
                    {
                    br++;a[i]='\0';t[q]='\0';
                    }
                }
            }
            printf("%d \n", br);
            br=0;
        }
        return 0;
    }  

程序本身就是这样做的:

第一次输入:测试用例数量
第二:你必须为每个测试用例输入一个数组和一个B数组 程序必须检查B中是否有与A匹配的常用字母,如果有,则输出它们的数量。

Example input: 
2
qwerty
abc
abcde
bcex
Output: 
0
3

我需要的是让它跑得更快。 任何帮助都是相关的。 :)

3 个答案:

答案 0 :(得分:2)

最好对两个字符串中的每个字符进行哈希处理。每个字符对应一个ASCII值。为两个字符串存储其他数组中每个字符的计数。比较哈希数组。

答案 1 :(得分:1)

将您的输入放在char的两个已排序容器中,例如deques。然后执行set intersection并测量结果的大小。这应该会显着降低复杂性

修改

使用用户输入修改已排序的双端队列的示例

void addChar2Deque(char newChar, std::deque<char> &sorted_cont) {
    sorted_cont.insert(std::lower_bound(sorted_cont.begin(), sorted_cont.end(), newChar), newChar);
}

如果您只能输入预取数据,那么您可以对数据进行排序,例如char大小为N的数组

std::sort(prefetched_data, prefetched_data+N);

在任何情况下,你最终都会得到两个可以与std::set_intersection进行比较的容器(deque或C数组)

std::vector<char> result;
std::set_intersection(std::begin(cont1), std::end(cont1),
    std::begin(cont2), std::end(cont2), std::back_inserter(result));
return result.size();

答案 2 :(得分:0)

为了与C ++标题的C代码保持一致,这是我所提到的查找表方法。由此产生的复杂度为O(N + M),其中N和M是各自字符串的长度。由于这是一个已成定局的结论,每个字符串中的每个字符必须至少访问一次(在这种情况下不超过这个),我在建议算法方面有点舒服,如果不进入asm就很难做得更好袋邻技巧。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>

int main()
{
    int n;
    if (scanf("%d", &n) != 1 || n < 0)
        return EXIT_FAILURE;

    while (n-- >0)
    {
        char a[7000], b[7000];
        if (scanf ("%7000s", a) == 1 && scanf ("%7000s", b) == 1)
        {
            unsigned short table[1 << CHAR_BIT] = {0};
            unsigned int answer = 0;
            const char *p;

            for (p=b; *p; ++table[(unsigned char)*p++]);
            for (p=a; *p; ++p)
            {
                if (table[(unsigned char)*p])
                {
                    --table[(unsigned char)*p];
                    ++answer;
                }
            }

            printf("%u\n", answer);
        }
    }

    return EXIT_SUCCESS;
}