Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка двумерного массива 
:(
    Опции темы
Gekt0r
Дата 23.2.2010, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Задача следующая.
Есть двумерный массив, очень большой, на несколько тысяч строк
Надо его отсортировать по заданному столбцу О_о
вопрос, как это можно сделать, чтобы было не слишком долго?
Есть идея сделать столбцы строками, и сортировать каждую строку по очереди. Только вот как, у меня знаний не хватает..
Подскажите, плз)
PM MAIL   Вверх
Gekt0r
Дата 23.2.2010, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



так, пока можно не отвечать... Что затупил под вечер, сейчас процесс пошел)
PM MAIL   Вверх
sir_nuf_nuf
Дата 23.2.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(Gekt0r @  23.2.2010,  01:06 Найти цитируемый пост)
Есть двумерный массив, очень большой, на несколько тысяч строк

это маааахонький массивчик


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
kavkaz
Дата 24.2.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 26.12.2007

Репутация: 1
Всего: 2



Если я вас правильно понял, то вам нужно преобразование Шварца. 
Пример:
Код

my @bigarray = (
    [3,4,5,6,7,8,9],
    [2,3,4,5,6,7,8],
    [1,2,3,4,5,6,7]
);
my @out = map {$_->[0]} sort { $a->[1] <=> $b->[1] } map { [ $_, $_->[0] ] } @bigarray;

Нужно прокомментировать?

PM MAIL ICQ Skype   Вверх
klem4
Дата 24.2.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



А зачем вообще мап ?
Код

my @bigarray = (
    [3,4,5,6,7,8,9],
    [2,3,4,5,6,7,18],
    [1,2,3,4,5,6,7]
);

my @out = @bigarray[sort { $bigarray[$a]->[6] <=> $bigarray[$b]->[6] } 0..$#bigarray];


Добавлено через 59 секунд
хотя на самом деле TIMTOWTDI
PM MAIL   Вверх
wanick
Дата 25.2.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



ну или так

Код

my @bigarray = (
    [3,4,5,6,7,8,9],
    [2,3,4,5,6,7,18],
    [1,2,3,4,5,6,7]
);
my @out = sort { $a->[6] <=> $b->[6] } @bigarray;


и не забывай что <=> числовое сравнение
а cmp, выполняет алфавитную сортировку в ASCII-порядке

PM MAIL   Вверх
amg
Дата 25.2.2010, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Преобразование Шварца здесь в самом деле ни к чему. Это преобразование применяется, когда для получения величины, по которой будет сортировка, нужны времязатратные вычисления. Типичный пример, который обычно приводят - сортировка файлов по времени.

@sorted_files = sort { -M $a <=> -M $b } @files;
При обычной сортировке массива из 1000 файлов медленная операция -M (медленная потому что обращается к диску) будет исполняться около 13000 раз (2*N*ln N).

@sorted_files = map {$_->[0]} sort { $a->[1] <=> $b->[1] } map { [ $_, -M $_ ] } @files;
С преобразованием Шварца -M будет исполняться только 1000 раз (N).
PM MAIL   Вверх
gcc
Дата 25.2.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



а интересно квантовый алгоритм будет ли быстрее работать?

Код

use Quantum::Superpositions;

my @a = (1,2,3,4,5,6,7,8,9,10);      # integers
my @b = (2,4,6,8,10,12,14,16,18,20); # doubled

my @unionAB        = sort { $a <=> $b } eigenstates( any(@a, @b) );
my @intersectionAB = sort { $a <=> $b } eigenstates( any(@a) == any(@b) );
my @differenceAB   = sort { $a <=> $b } eigenstates( any(@a) != all(@b) );

print "@intersectionAB\n";





Это сообщение отредактировал(а) gcc - 25.2.2010, 21:55
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 28.2.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(gcc @  25.2.2010,  21:51 Найти цитируемый пост)
а интересно квантовый алгоритм будет ли быстрее работать

не, не будет. У вас же обычный, а не квантовый компьютер, поэтому намного эффективней чем QuickSort вы не получите.


Вообще сортировать двумерный массив по N ому столбцу нужно так:
Код

my @bigarray = (
    [3,4,5,6,7,8,9],
    [2,3,4,5,6,7,8],
    [1,2,3,4,5,6,7]
);
my $N = 3;  # по 4 ому столбцу
@bigarray = sort {$a->[$N] <=> $b->[$N]} @bigarray;


klem4, Заметьте, что массив @bigarray - это массив ссылок  (ARRAYREFов), 
поэтому при его сортировке никаких тяжелых операций копирования не происходит.
Просто переставляются ссылки (обычные скаляры).





--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
gcc
Дата 28.2.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



sir_nuf_nuf, понтяно, тут вот написано что квантовый алгоритм Гровера быстрее чем любая РСУБД

Алгоритм Гровера



Это сообщение отредактировал(а) gcc - 28.2.2010, 15:58
PM WWW ICQ Skype GTalk Jabber   Вверх
mvsgt
Дата 28.2.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Цитата(gcc @  28.2.2010,  15:57 Найти цитируемый пост)
тут вот написано что квантовый алгоритм Гровера быстрее чем любая РСУБД


но алгоритм Гровера не даст точного результата,  в отличии от РСУБД. 
Кстати, в Википедии ничего про РСУБД и не сказано smile
PM MAIL   Вверх
gcc
Дата 2.4.2010, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



кстате, это все таки интересная штука Quantum::Superpositions;

получается поиск по массиву быстрее чем map foreach grep exists (хеш) void у любом случае...

этов mod_perl:
(в CGI будет другие цифры, наверное)

Код

use Quantum::Superpositions;

sub ha2 : Private {
    my ( $self, $c ) = @_;
    
my $hh = {'moder_se' => 1,
                                                  'moder_co' => 1,
                                                  'add_co' => 1,
                                                  'add_se' => 1,
                                                  'moder_user' => 1,
                                                  'admin_user' => 1,
                                                  'super_admin_user' => 1
                                                  
};    

 # print '1' if ( $hh->{moder_se});

# map foreach grep exists void
 print grep  
    $_ eq 'moder_se'
    , @{$c->user->{roles}};
  

    
 }


sub qm : Private {
    my ( $self, $c ) = @_;
 
   
print '7'       if ( 'moder_se' eq any (@{$c->user->{roles}}) );
    
    
}   


Код


|  -> /ha2                                                   | 0.014492s |
|  -> /qm                                                    | 0.002837s |


Добавлено @ 06:44
mvsgt, ну там по ссылке вроде бы написано что нету других алгоритмов...  А по другой ссылке написано, что будет быстрее чем база данных http://www.opennet.ru/docs/RUS/perl_obzor/...s/quantium.html

Это сообщение отредактировал(а) gcc - 2.4.2010, 07:27
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1109 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.