【问题标题】:How can I optimize my code for large number of strings on input如何针对输入中的大量字符串优化我的代码
【发布时间】:2020-07-10 15:45:43
【问题描述】:

我在大学编译器上通过了 4 次测试,问题是第 5 次。每次测试的时间限制为 1 秒。如何优化此代码,如果我比较字符串,也许有更好的排序选择?我的代码:

#include <iostream>
#include <string.h>

using namespace std;

void qsort(string &tab, int min, int max)
{
    if(min<max)
    {
        int min_min = min;
        for(int i=min+1;i<=max;i++)
        {
            if(tab[i]<tab[min])
            {
                swap(tab[++min_min],tab[i]);
            }
        }
        swap(tab[min],tab[min_min]);
        qsort(tab,min,min_min-1);
        qsort(tab,min_min+1,max);

    }
}
bool sprawdz(string tab,string tab2)
{
    for(int i=0;i<tab.length();i++)
    {
        if(tab[i]!=tab2[i])
        {
            return false;
            break;
        }
    }
    return true;
}

int main()
{
    string tablica1, tablica2;
    int ile;

    scanf("%d",&ile);
    for(int i=0;i<ile;i++)
    {
        cin>>tablica1>>tablica2;
        qsort(tablica1,0,tablica1.length()-1);
        qsort(tablica2,0,tablica2.length()-1);

        if(tablica1==tablica2)
        {
            printf("TAK\n");
        }
        else
        {
            printf("NIE\n");
        }


    }

    return 0;
}

它抛出的唯一信息是 min = 25177 最大值 = 25978 所以这些数字相当大。有任何想法吗?任务是检查单词是否是字谜。

【问题讨论】:

  • 如果允许的话,不要按值传递字符串并使用std::sort
  • 算法被禁止,不按值传字符串是什么意思?
  • @BartekJuśkiewicz 他们的意思是:改用引用。
  • 我指的是bool sprawdz(string tab,string tab2),但您似乎没有使用该功能
  • 哦对了,这个功能没用,我删了

标签: c++ sorting optimization quicksort


【解决方案1】:

如果我比较字符串,也许有更好的排序选择?

我最喜欢的提示:做某事的最佳方式是不做;)

您不必对字符串进行排序以检查它们是否是字谜。顺序对于字谜并不重要,那么为什么要对它们进行排序呢?

排序通常是O(n log n),而简单地计算字符的频率是O(n)。要计算字符,您可以使用std::unordered_map,或者如果不允许使用计数器数组。遍历字符串以计算每个字符的出现次数,然后比较计数器数组。

PS:在应用任何进一步的逻辑之前,您还应该检查字符串的大小是否相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多