Почему C ++ намного медленнее, чем Java в этом алгоритме Tr ie? - PullRequest
0 голосов
/ 06 мая 2020

Я решаю задачу 336 в Leetcode, в то время как я нашел самый высокий ответ здесь использовал структуру Tr ie в java. Итак, я снова написал это на C ++. Я пытался оптимизировать, но время выполнения и память по-прежнему очень плохие. Изначально использовал shared_ptr, потом время выполнения: ~ 800 мс, память: 400Мб. Затем я использовал новый указатель, он стал ~ 300мс, 200Мб. Все еще намного медленнее, чем Java (20 мс, 50 ​​МБ). Несколько раз пробовал, но все равно в 10 раз медленнее. Моя структура кода и logi c точно такие же, как и реализованный код java, но он такой медленный. Я не могу понять почему! вот мой код:

struct TrieNode {
    TrieNode *next[26];
    int index = -1;
    vector<int> list;
    TrieNode(){
        memset(next,NULL,sizeof(next));
    }
    ~TrieNode() {
        for (int i = 0; i < 26; ++i) {
            if (next[i]) delete(next[i]);
        }
    }
};

bool isPalindrome(const string &word, int start, int end) {
    while (start < end) {
        if (word[start] != word[end])
            return false;
        ++start;
        --end;
    }
    return true;
}

int addword(TrieNode* root, const string &word, int index) {
    for (int i = word.size() - 1; i >= 0; --i) {
        int j = word[i] - 'a';
        if (!(root->next[j])) {
            root->next[j] = new TrieNode;
        }
        if (isPalindrome(word, 0, i))
            root->list.push_back(index);
        root = root->next[j];
    }
    root->index = index;
    root->list.push_back(index);
    return 0;
}

void search(TrieNode* root, vector<string> &words, int index, vector<vector<int>> &res) {
    for (int i = 0; i < words[index].size(); ++i) {
        if (root->index >= 0 && root->index != index && isPalindrome(words[index], i, words[index].size() - 1)) {
            res.push_back({index, root->index});
        }
        root = root->next[words[index][i] - 'a'];
        if (!root) return;
    }
    for (int i : root->list) {
        if (i == index) continue;
        res.push_back({index, i});
    }
}

vector<vector<int>> palindromePairs(vector<string>& words) {
    vector<vector<int>> res;
    TrieNode *root = new TrieNode;
    for (int i = 0; i < words.size(); ++i) {
        addword(root, words[i], i);
    }
    for (int i = 0; i < words.size(); ++i) {
        search(root, words, i, res);
    }
    delete root;
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...