LINUX.ORG.RU

Перл: убрать лишние значения из массива


0

0

Дан сортированниый массив целых чисел (напр. 0 1 2 2 3 4 5 8 12 12). Как легче всего убрать из него повторяющиеся числа? Ничего умнее, кроме копирования каждого элемента во временный массив (после проверки на уникальность) не придумал.

anonymous

может скопировать все в хеш?

anonymous
()

perl:

@uniq=grep{!$_{$_}++}=@mass;
про подстроке

@uniq=grep{!$_{$1}++ if m!^\d+\s\d!}=@mass;

awk:

cat massiv.txt | awk '!_[$0]++'|awk '{print $0";"}'

по подстроке:

cat massiv.txt | awk '!_[$1]++'|awk '{print $0";"}'

vilfred ☆☆
()
Ответ на: комментарий от vilfred

%hash = map { $_ => 1} @src;
@dst = keys %hash;

функция map возвращает хешу %hash значения массива @src, как ключи со значениями равными 1. т.к. у хеша не мощет быть одинаковых ключей, то одинаковые элементы просто переписываются. Затем ключи помещаются в массив @dst с помощью функции keys.

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

ну тогда у меня сверх задая, я еще и знаю число повторяющихся ключей. иногда бывает нужно.

два, по поводу сортировки, яб так сделал

print join "\n" => sort {$a <=> $b} grep {!$_{$_}++} @m;

vilfred ☆☆
()
Ответ на: комментарий от sdio

>При использовании хеша потеряется порядок, надо снова сортировать массив.

Ну да... а ты думал в сказку попал ? :)

%hash = map { $_ => 1} @src;
@dst =sort {$a <=> $b} keys %hash;

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

>я еще и знаю число повторяющихся ключей. иногда бывает нужно

но если не нужно, то мой вариант читается проще...

golodranez ★★★★
()

Чего только народ не придумает, чтобы свою голову не напрягать.
Хеши, трубы... А вот так совсем не вдохновляет? 
Это не перл, но не велика разница.

int my_unique( const char* first, const char* last, char* dest )
{
	if( first == last )
		return 0;
	char* p = dest;
	char val = *first;
	*dest = val;
	while( ++first != last )
	{
		if( val != *first )
		{
			val = *first;
			*++dest = val;
		}
	}
	return dest - p + 1;
}

Можно в качестве first и dest указать один адрес. Возвращает размер нового массива.

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

И я о том же.
1. массив -> Хэш + сорт = O(n)+O(n*log(n))  + "лишняя сложность"
2. массив -> массив = O(n) + "просто и понятно"

sdio ★★★★★
()

А не проще скормить данные uniq?

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

>2. массив -> массив = O(n) + "просто и понятно"

да ну...:) ну ты даёшь

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

>Чего только народ не придумает, чтобы свою голову не напрягать.

Вопрос был про перл, а ты предлагаешь изобретать велосипеды...

Запомните - перл не тот язык выбирая который программист задумывается о производительности, главный его(ПЕРЛА) плюс - скорость разработки и простота добавления нового функционала...

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

>Чего только народ не придумает, чтобы свою голову не напрягать.

А зачем придумали языки высокого уровня ?

>Это не перл, но не велика разница.

Разница велика - на перле так никто писать бы не стал...тк глупо...
Про подобный код Ларру Уолл где-то писал:"Так написал бы програмист ипорченый Си" - имеется ввиду, что твой код(один в один) только на перле...

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

Вот и я говорю, что писать надо на с++.

dest+end = std::unique( first, last, dest_begin );

Просто, коротко и читабельно. Гы Гы Гы :) Ладно, ладно, не буду стебаться.

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

>Просто, коротко и читабельно. Гы Гы Гы :) Ладно, ладно, не буду стебаться.

Стебаться это хорошо... :)))

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

> Это не перл, но не велика разница.

Все-таки разница будет:

$p = $x[0] - 1;
@x = map { ($p != $_) ? $p = $_ : () } @x;

amm
()
Ответ на: комментарий от sdio

>Программист стремящийся к красивому коду, в ущерб АЛГОРИТМУ == "быдлокодер".

опровержения твоей фразы я привёл выше...больше не читай по-диагонали...

не.. с такими разговаривать бесполезно... а жаль, народ забивает себе мозги непойми чем...

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

Твои слова?
> мой вариант читается проще...
              ^^^^^^^^ -- и это все преимущество?
> перл не тот язык выбирая который программист задумывается
> о производительности
А о чем надо думать? О красоте?

> главный его(ПЕРЛА) плюс - скорость разработки и
> простота добавления нового функционала...
Значит  массив -- > хэш --> сортировка -> массив  --- быстре и проще,
чем массив --> проверка  -> массив ?

>а жаль, народ забивает себе мозги непойми чем...
Ты-то точно не ищешь легких путей.
Успехов тебе!

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

>Значит массив -- > хэш --> сортировка -> массив --- быстре и проще,
чем массив --> проверка -> массив ?

Блин!!! Что ты тупишь????!!!!
Я не говорил что мой способ быстрее, я сказал что твой способ оценки сложности алгоритма годится только для детского сада...

PS Так ты не ответил по поводу языков высокого уровня...
PPS Советую погуглить на тему "мощных языков програмирования" (hint: не Си, не Си++ к таковым не относятся, а вот языки уровня Перла и Лиспа да)

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

>я сказал что твой способ оценки сложности алгоритма 
>годится только для детского сада... 
Ну просвяти, как надо правильно это делать?

>Так ты не ответил по поводу языков высокого уровня...
А ты не спрашивал.

>погуглить на тему "мощных языков програмирования"
Ну и? Они сортируют по другому? Что ты хотел сказать-то?
Заметь, я не говорил о конкретной _реализации_ алгоритма.

P.S. И еще, держи свои эмоции про себе, я и послать могу, если что.

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

>P.S. И еще, держи свои эмоции про себе, я и послать могу, если что.

Если грубо что сказал, то извини... я не сторонник ругани, какой бы небыл повод...

А теперь по делу:
>Ну просвяти, как надо правильно это делать?
Ты не учёл хотя-бы перебор элементов

>А ты не спрашивал.
Да, был не прав - спрашивал не у тебя, но может ты ответишь...?

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

>Ты не учёл хотя-бы перебор элементов 
массив->проверка->массив         -- как не крути все равно О(n)
массив -> hash -> sort -> массив -- в лучшем случае О(n)+O(n*log(n))

Обьясни. Ты считаешь это не правильно? С радостью просвещусь. 

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