簡體   English   中英

C++ Anagram Solver 速度優化

[英]C++ Anagram Solver speed optimization

我決定為我父親制作一個字謎求解器。 我對編程很陌生,但我想我仍然可以做到。 我的成品工作,但它真的很慢,例如找到 8 個字符的所有組合大約需要 15 分鍾以上。 我正在尋找優化它/使其更快的方法。

在 Clion 2019.3.4 上使用 MinGW c++ 編譯器,cpu:i7 9700k,RAM:16GB/3200mhz。

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

//Menu for interacting with user, not really important
void menu() {
    cout << "=========================" << endl;
    cout << "======== !WOW! ==========" << endl;
    cout << "=========================" << endl;
    cout << "1 ... INSERT" << endl;
    cout << "2 ... PRINT" << endl;
    cout << "3 ... LIMIT WORD LENTGH" << endl;
    cout << "4 ... NEW GAME" << endl;
    cout << "0 ... EXIT" << endl;
    cout << "=========================" << endl;
    cout << "Select: ";
}

//Function to find all possible combinations from letters of a given string 
void get(vector<string> &vec, string str, string res) {

    vec.push_back(res);

    for (int i = 0; i < str.length(); i++)
        get(vec, string(str).erase(i, 1), res + str[i]);
}

//Only for testing purposes
void printVec(vector<string> vec) {
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
}

//Function to check if a given word exists in given .txt file
bool checkWord(vector<string> &vec2, string filename, string search) {

    string line;
    ifstream myFile;
    myFile.open(filename);

    if (myFile.is_open()) {
        while (!myFile.eof()) {
            getline(myFile, line);
            if (line == search) {
                vec2.push_back(line);
                return true;
            }
        }
        myFile.close();
    } else
        cout << "Unable to open this file." << endl;

    return false;
}


int main() {

    int selection;
    bool running = true;
    string stringOfChars;
    vector<string> vec;
    vector<string> vec2;

    do {

        menu();
        cin >> selection;
        switch (selection) {

            case 1:
                cout << "Insert letters one after another: ";
                cin >> stringOfChars;
                get(vec, stringOfChars, ""); //fill first vector(vec) with all possible combinations.
                break;

            case 2:
                for (int i = 0; i < vec.size(); i++) {
                    if (checkWord(vec2, "C:/file.txt", vec[i])) { //For each word in vector(vec) check if exists in file.txt, if it does, send it in vector(vec2) and return true
//Reason for vec2's existence is that later I want to implement functions to manipulate with possible solutions (like remove words i have already guessed, or as shown in case 3, to limit the word length)
                        cout << vec[i] << endl; //If return value == true cout the word
                    }
                }
                break;

            case 3:
                int numOfLetters;
                cout << "Word has a known number of letters: ";
                cin >> numOfLetters;
                for (int i = 0; i < vec2.size(); i++) { /*vec2 is now filled with all the answers, we can limit the output if we know the length of the word */
                    if (vec2[i].length() == numOfLetters) {
                        cout << vec2[i] << endl;
                    }
                }
                break;

            case 4:
                vec.clear();
                vec2.clear();
                break;

            case 0:
                running = false;
                break;

            default:
                cout << "Wrong selection!" << endl;
                break;
        }
        cout << endl;
    } while (running);

    return 0;
}


file.txt 充滿了我的語言中的所有單詞,按字母順序排列,大小為 50mb。

aachecnska
aachenskega
aachenskem
aachenski
.
.
.
bab
baba
babah
.
.
.

任何建議或離題提示都會有所幫助。 我的想法之一是可能將 file.txt 分隔在較小的文件中,例如將具有相同起始字母的行放在自己的文件中,因此 A.txt 將僅包含以 A 等開頭的單詞...而不是更改相應地編碼。

這是您需要使用分析器的地方。 在 Linux 上,我最喜歡的是 kcachgrind

http://kcachegrind.sourceforge.net/html/Home.html

它為您提供逐行計時信息,並告訴您最應該優化的代碼部分。

當然,有許多可用的分析器,包括商業分析器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM