LINUX.ORG.RU

Вопрос по коду

 


1

3

Есть вот код который считает кол-во повторений слов из файла и пишет результат в файл вопрос почему долго выполняется? https://www.dropbox.com/sh/bjo8wlqs6tlfh1s/AABJi7XBW02Z9RTPNKdjh5GMa?dl=0

Перемещено leave из general



Последнее исправление: Gremlin_ (всего исправлений: 2)

testtaskjunior.cpp
while (i < line.length() && ((line >= 'a' && line <= 'z') || (line >= 'A' && line <= 'Z') || (line >= 'à' && line <= 'ÿ') || (line >= 'À' && line <= 'ß')))

Да ну нафиг.

Stil ★★★★★
()

Нет, ты серьёзно? Сложность работы своего мега-алгоритма сможешь оценить?

Марш изучать, какие структуры данных бывают и зачем они нужны. Даже на джуна тест ты провалил.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 1)
Ответ на: комментарий от Gremlin_

Есть такая замечательная функция islower() для проверки того, является ли символ буквой.

tiandrey ★★★★★
()
Ответ на: комментарий от Gremlin_

Списки, массивы, деревья, ассоциативные массивы. RTFM. Всё в STL есть.

Подсказка: поиск слова полным перебором - твоя ошибка.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 2)
Ответ на: комментарий от Gremlin_

Не знаешь, если такие предложения выдвигаешь.

tiandrey ★★★★★
()
Ответ на: комментарий от Gremlin_

Понятно и читаемо - разные вещи. Вот я могу тебе формулу накатать, она будет понятной (если ты матан знаешь), а что это и где применяется хрен поймешь.

peregrine ★★★★★
()
Ответ на: комментарий от Gremlin_

Используй костыли с map<string,int> вместо костылей с list.
Просто парсишь слово word, а потом words[word]++;
http://www.cplusplus.com/reference/map/map/operator[]/

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

Жесть просто. Даже не учитывая неэффективность алгоритма, написано не очень хорошо.
Попробуй переписать все заново и почитай, к примеру, про std::unordered_map

ktan ★★★
()

Вообщем нужно выполнить

words.sort();

тогда раскоментится закоменченная строка а всё остальное закоментится до конца блока, только нужно правильно синтаксис подобрать

Gremlin_
() автор топика

Какой ад. Надеюсь, это тупой троллинг.

tailgunner ★★★★★
()

каша какая

прям как мои первые поделки. Попробуй декомпозировать для начала, а то читать больно

reprimand ★★★★★
()

вопрос почему долго выполняется?

Потому что:

    list<table> words;

                for (list<table>::iterator k = words.begin(); k != words.end(); ++k)
                {
                    int match = 0;
                    for (int j = 0; j < (*k).word.length(), j < subline.length(); j++)
                    {
                        if (subline[j] == (*k).word[j])
                            match++;
                        else
                            break;
                    }
                    if (match == (*k).word.length())
                    {
                        (*k).count++;
                        flag = true;
                    }
                }

invy ★★★★★
()
Ответ на: комментарий от Gremlin_

Ну надо править , только с какого момента?

С ДНК.

А серьезно, найди нормальную книжку и почитай как правильно эту задачу решать.

invy ★★★★★
()
Ответ на: комментарий от invy

а ну break во 2й if закинуть чуть быстрее будет

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

проще

    unordered_map<string, int> word_count;
    boost::char_separator<char> sep(([]() {
        string res;
        for (int c = 1; c < 256; c ++)
            if (!isalpha(c))
                res += c;
        return res;
    })().c_str());
    string line;
    while (readfile.is_open() && getline(readfile, line)) {
        boost::tokenizer<boost::char_separator<char>> tok(line, sep);
        for (const auto &word : tok) {
            if (word.size() > 0)
                word_count[word] += 1;
        }
    }

Кстати, у тебя в программе баг. Поищи в файлах данных строку «PCI».

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat
#include <unordered_map>
#include <string>
#include <iostream>

struct word_delimiter : std::ctype<char> {
  word_delimiter() : std::ctype<char>(get_table()) {}
  static mask const* get_table()
  {
    static mask rc[table_size];
    for(int i = 1; i < 256; ++i) {
      if(!std::isalnum(i))
        rc[i] = std::ctype_base::space;
    }
    return &rc[0];
  }
};

int main()
{
  std::unordered_map<std::string, uint32_t> wordsCount;
  std::string word;

  std::cin.imbue(std::locale(std::cin.getloc(), new word_delimiter));

  while(std::cin >> word) {
    if(wordsCount.find(word) == wordsCount.end())
      wordsCount[word] = 1;
    else
      wordsCount[word]++;
  }
  for(auto p : wordsCount) {
    std::cout << p.first << ": " << p.second << "\n";
  }
}
invy ★★★★★
()

Едва ли не в каждой строчке кода что-то да не так — это просто жесть какая-то, а потом код, написанными такими джуниорами, кому-то приходится поддерживать.

Softwayer ★★
()
Ответ на: комментарий от invy
if(wordsCount.find(word) == wordsCount.end())
  wordsCount[word] = 1;
else
  wordsCount[word]++;

Можно просто ++wordsCount[word], ведь если элемента ещё нет в мапе, то он инициализируется нулём.

Softwayer ★★
()
Ответ на: комментарий от asaw

это сильно даже для C.

Может чувак только что сдал экзамен по реляционным базам данных, и немного двинулся на кортежах.

morse ★★★★★
()

Открой для себя хеш-таблицы. А заодно и очереди с приоритетом.

mix_mix ★★★★★
()
Ответ на: комментарий от invy

Ну и говнище. Читается не лучше, чем у автора. Да, возможно у тебя опыта побольше, но лучше соображать от этого ты не стал. Пошёл бы ты лучше книжку почитал, про животноводство, например. Баги исправлять будешь, иксперт? Живёте в своём мирке, где существует только одна доисторическая кодировка и где ваш говнокод «нужен» только вам, например, для того, чтобы «блеснуть» им на форуме перед менее опытным быдлом. Я бы посмотрел не тебя на собеседовании, когда твой говнокодик поломался бы на совершенно простом файле, написанном секретаршей.

anonymous
()
Ответ на: комментарий от invy
  while(std::cin >> word) {
    if(wordsCount.find(word) == wordsCount.end())
      wordsCount[word] = 1;
    else
      wordsCount[word]++;
  }

можно проще:

  while(std::cin >> word) {
    wordsCount[word]++;
  }
andreyu ★★★★★
()
Ответ на: комментарий от anonymous

поломался бы на совершенно простом файле, написанном секретаршей.

Поменяй 256 на 128.

invy ★★★★★
()
Ответ на: комментарий от invy
    if(wordsCount.find(word) == wordsCount.end())
      wordsCount[word] = 1;
    else
      wordsCount[word]++;

можно просто

++wordsCount[word];

пс. слоупок я(

vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 1)
Ответ на: комментарий от Gremlin_

Если бы это было тестовое задание, я сказал бы, что ты его провалил. С твоим кодом определённо не всё в порядке. Но главная проблема в том, что ты не видишь, что там есть проблема.

Ты ведь не думаешь, что твой код понятнее, чем:

  std::cin.imbue(std::locale(std::cin.getloc(), new word_delimiter));

  while(std::cin >> word) {
    wordsCount[word]++;
  }
  for(auto p : wordsCount) {
    std::cout << p.first << ": " << p.second << "\n";
  }

Твоя задача состоит в том, чтобы прочитать файл по словам и посчитать число вхождений каждого слова. По коду выше это просто читается по коду. В твой же код нужно вникать. Если в нём есть ошибка, её трудно найти и исправить.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.