Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.02.2010, 21:51
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Отсортировать ключи из Dictionary в dense Array по значениям?

Вот, столкнулся с проблемным алгоритмом, никак не найду хорошее решение.
Что есть:
Код:
Dictionary /*Object, int*/
{
    obj1 => 100,
    obj2 => 25,
    obj3 => -1,
    obj4 => 200
}
нужно получить на выходе:
Код:
Array /*Object*/ [ obj2, obj1, obj4, obj3 ]
( любые отрицательные значения добавляются в конец массива вне зависимости от того, на сколько они отрицательные)
Как ни сделаю, все очень медленно получается...
__________________
Hell is the possibility of sanity

Старый 13.02.2010, 22:32
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Наряду с Dictionary держать массив, и при добавлении элементов сразу вставлять их в нужное место. Проигрыш в памяти, выигрыш в вычислительных ресурсах.
__________________
тонкий тролль, осеянный благодатью

Старый 13.02.2010, 22:51
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Не получится, в Dictionary должны быть слабые ключи... да и таким образом мы выиграем на нахождении и проиграем при добавлении, что, вобщем-то будет так на так...
__________________
Hell is the possibility of sanity

Старый 13.02.2010, 23:38
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 4  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Ну добавлять обычно реже приходится, чем искать
Плюс по Dictionary искать придется перебором, а в отсортированный массив можно добавлять скажем бинарными вставками.
А зачем weak keys?
__________________
тонкий тролль, осеянный благодатью

Старый 14.02.2010, 00:04
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Это все для той же системы сигнал-слот. Добавляются колбеки. нужно отсортировать по priority.

Да, кстати, сейчас поэксперементировал с нативным диспатчером, если добавлять с разной priority то добавление слушаетелей отнимает кучу времени... просто ну очень много. Т.е. там скорее всего сделано, как ты и предлагаешь.
Т.е. по тестам получилось:

Код:
EventDispatcher
addEventListener: 10446
dispatchEvent: 67
Код:
Signal
add: 167
call: 7975
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 14.02.2010 в 00:15.
Старый 14.02.2010, 00:15
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
вариант
Код AS3:
private function sortDict(dict:Dictionary):Array
{
	var nArr:Array = [];
	var pArr:Array = [];
	//раскидываем на два массива
	for ( var obj:Object in dict ) 
	{
		if (dict[obj] < 0)
		{
			nArr.push(obj);
		}else
		{
			pArr.push( { val:dict[obj], obj:obj } );
		}
	}
	//положительный сортируем 
	pArr.sortOn(["val"], Array.NUMERIC);
 
	var res:Array = [];
	for (var i:int = 0; i < pArr.length; i++) 
	{
		res.push(pArr[i].obj);
	}
	// добавляем отрицательный
	return res.concat(nArr);
}

Старый 14.02.2010, 00:45
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Спасибо, я по похожему пути в итоге и пошел (только решил добавлять сразу в Dictionary объекты со ссылками на priority и слушателя - хотя, надо ще подумать, может быть так будет выгоднее...).
__________________
Hell is the possibility of sanity

Старый 14.02.2010, 01:37
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 8  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
ага, обогнать родной sort (хотя он вроде бы и просто пузырьковый) все равно не получится (если у кого есть примеры, очень хочу)
т.е. вопрос в оптимизации структуры, чтобы с меньшими потерями сгенерить массив, который этому сорту подсунуть,
тут 'объекты со ссылками на priority' скорее всего выиграют

Старый 14.02.2010, 03:15
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Если в массиве только чисельные типы, то можно, мне где-то попадлася... Shell сортом. Для сложных объектов - не знаю, но и флеш сложные объекты тоже долго сортитует
Да, и флешевый сорт он какой-то не очень пузырьковый... посмотри в каком порядке он аргументы выдает в колбек... т.е. он как-то с середины начинает. В смысле, алгоритм может быть и тот же, но не классическая реализация.

PS: http://blog.inspirit.ru/?p=271
__________________
Hell is the possibility of sanity

Старый 14.02.2010, 13:00
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 10  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>http://blog.inspirit.ru/?p=271
спасибо, отличный материал
интересная вещь походу выяснилась: смотрю код, который автор дает, и вижу совершенно противоположные результаты, чем во флешке на сайте..
оказалось, что в дебаговой версии (у него пример под трейсы заточен) встроенный сорт все равно обгоняет любой самописный
//-debug=true
Flash Sort:135 (самый быстрый в релизной версии)
array.sort:90

//-debug=false
Flash Sort:47
array.sort:95

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:31.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.