Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Найти одинаковые строки в файле!  (Прочитано 9819 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #15 : 10 Июля 2008, 00:15:59 »
Раз выкладываем на разных языках
[оффтоп]вот она, "прелесть" C++: на перле все тривиально, на питоне тоже, а вот тут я полминуты фтыкал: где же добавление в map строк, встреченных впервые :) и это при том, что из 3-х языков я знаю лучше всего именно C++...[/оффтоп]

присоединяюсь к вопросу про производительность: почему эта реализация медленная?

Оффлайн S.Tokarev

  • Активист
  • *
  • Сообщений: 415
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #16 : 10 Июля 2008, 10:07:26 »
Цитировать
хочу предупредить что  реализация тормозная до нельзя :)
Неужели тормознее perl-а? Это не попытка обидеть perl, просто любопытство. Обычно на низкоуровневых языках получается быстрее. Впрочем, мой опыт из области вычислений, а не обработки текста.
Тормоза в темплейте, а не в языке.
"Поиск/доступ" в перле к элементу хеша почти не зависит от заполненности хеша.

Оффлайн Agafonov

  • Администратор
  • Старожил
  • *
  • Сообщений: 1114
  • Нам помехи не страшны!
    • Просмотр профиля
    • Живу в сети...
Re: Найти одинаковые строки в файле!
« Ответ #17 : 10 Июля 2008, 11:43:14 »
Тормоза в темплейте, а не в языке.
"Поиск/доступ" в перле к элементу хеша почти не зависит от заполненности хеша.

И что <map> в c++ идиоты не знакомые с быстрыми алгоритмами поиска люди писали?
Ubuntu 16.04 LTS @ Desktop & Servers

Оффлайн Agafonov

  • Администратор
  • Старожил
  • *
  • Сообщений: 1114
  • Нам помехи не страшны!
    • Просмотр профиля
    • Живу в сети...
Re: Найти одинаковые строки в файле!
« Ответ #18 : 10 Июля 2008, 11:47:51 »
или можно на питоне :)
#!/usr/bin/env python
wr = open('out.txt', 'w')
map(wr.write, set(open('in.txt', 'r').xreadlines()))

in.txt - входящий файл
out.txt - результат

Этот код сохранит порядок строк?
Ubuntu 16.04 LTS @ Desktop & Servers

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #19 : 10 Июля 2008, 11:52:01 »
Тормоза в темплейте, а не в языке.
"Поиск/доступ" в перле к элементу хеша почти не зависит от заполненности хеша.

И что <map> в c++ идиоты не знакомые с быстрыми алгоритмами поиска люди писали?
видимо, имеется в виду, что <map> - это не хэш-таблица, а бинарное дерево... но imho, разница в скорости доступа O(1) и O(log2(N)) начинает сказываться совсем не на таких объемах данных, которые предполагается обрабатывать...

Оффлайн Bers

  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
    • Домашняя страничка
Re: Найти одинаковые строки в файле!
« Ответ #20 : 10 Июля 2008, 12:48:01 »
Этот код сохранит порядок строк?

нет, автору этого и не требовалось

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #21 : 10 Июля 2008, 17:30:58 »
Да тормознее перла. причем серьёзно тормознее. Наслаждайтесь.
2 S.Tokarev: Тормоза не в темплейтах а в реализации самого <map>. Темплейты там не виноваты.

Оффлайн S.Tokarev

  • Активист
  • *
  • Сообщений: 415
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #22 : 10 Июля 2008, 17:34:12 »
Да тормознее перла. причем серьёзно тормознее. Наслаждайтесь.
2 S.Tokarev: Тормоза не в темплейтах а в реализации самого <map>. Темплейты там не виноваты.
Я это и имел ввиду. <map> вроде и есть темплейт. Хотя могу ошибаться.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #23 : 22 Января 2009, 12:50:15 »
Читаем http://google-sparsehash.googlecode.com/svn/trunk/doc/performance.html
Качаем http://google-sparsehash.googlecode.com/files/sparsehash_1.3-1_i386.deb , устанавливаем.
Копируем
#include <cstdio>
#include <google/dense_hash_map>

using google::dense_hash_map;
using __gnu_cxx::hash;

struct eqstr
{
  bool operator()(const char* s1, const char* s2) const
  {
    return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
  }
};

int main(int argc, char** argv) {
    char *str = NULL;
    size_t sz = 0;

    dense_hash_map<const char*, int, hash<const char*>, eqstr> str_map;
    str_map.set_empty_key(NULL);

    while (getline(&str, &sz, stdin) != -1) {
        int& ref = str_map[str];
        if (!ref) {
            printf("%s", str);
            ref = 1;
        }
    }

    if (!str)
        free(str);

    return (EXIT_SUCCESS);
}
Программа стала примерно в два раза быстрее. Но все равно до перла как до Индии пешком. =(
P.S. у кого есть программка на С/С++ не уступающая perl в скорости?

Оффлайн Agafonov

  • Администратор
  • Старожил
  • *
  • Сообщений: 1114
  • Нам помехи не страшны!
    • Просмотр профиля
    • Живу в сети...
Re: Найти одинаковые строки в файле!
« Ответ #24 : 23 Января 2009, 01:08:11 »
Чёрт, на чём же они написали сам Perl?  ???
Ubuntu 16.04 LTS @ Desktop & Servers

Оффлайн HoudiniWater

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #25 : 23 Января 2009, 04:22:32 »
Мне кажется, что если спрашивают на форуме по линуксу решение какой-то задачи, то не надо давать решение на перле, питоне, руби и хз чем.
Вот простое решение, если файл называется file, то

cat file | sort | uniq
и всё, не изобретайте велосипед.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #26 : 23 Января 2009, 07:23:19 »
Блин, HoudiniWater, форум хоть и про Linux и даже конкретнее про дистрибутив Ubuntu, но чем здесь только не занимаются. И этото раздел форума посвящен программированию. Поздравляю! ты рекордсмен! у тебя самое тормозное решение! Еще и порядок строк изменен так что
"Зина, в печку!" (с) довольно известный профессор. Я просил быстрое решение, если ты читать не умеешь. Причем на языке С/С++. Разуй глаза.

Чёрт, на чём же они написали сам Perl?  ???
Что-то мне подсказывает что там Си. В чистом виде. Значит вообще задачка имеет решение. Но качать весь тарболл с перлом и потом петрушить его...
Если кто-нибудь геройски выполнит сие деяние, прошу выложить решение сюда.
Остальных "героев, кторые не любят изобретать велосипеды" ака HoudiniWater я прошу не беспокоиться. Без вас уже давно справились. Заранее спасибо за понимание.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #27 : 23 Января 2009, 11:32:37 »
Эхх, раз пошла пьянка с реализациями алгоритма на разных языках... :)

http://www.99-bottles-of-beer.net/
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн HoudiniWater

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #28 : 24 Января 2009, 04:49:50 »
Yurror, решение просили, не вы, а lumen_xp, более того было специально оговорено, что сохранение порядка строк не важно.
При всех недостатоков моего решения, оно самое простое из всех и всем будет понятно, и пишется оно за 3 секунды.

Хотя, проверить на скорость мне было бы тоже интересно. Есть уже какой-нибудь тестовый файлик?

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: Найти одинаковые строки в файле!
« Ответ #29 : 24 Января 2009, 14:48:00 »
sova@sova:~$ wc -l access_log.30
144898 access_log.30
// C++ с map (первый пример)
sova@sova:~$ time -p ./unify < access_log.30 > /dev/null
real 3.36
user 3.31
sys 0.05
//Perl
sova@sova:~$ time -p perl ./unify.pl < access_log.30 > /dev/null
real 0.70
user 0.64
sys 0.06
//Shell
sova@sova:~$ time -p cat access_log.30 | sort | uniq > /dev/null
real 3.01
user 2.79
sys 0.23
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.