Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Array. Перемешивание массива (http://www.flasher.ru/forum/showthread.php?t=205218)

feelgood66 25.11.2013 14:34

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

Задача
приходит массив [x,x,x,y,y,y,y,y,y,z,z]

нужно его перемешать так, чтобы ни один элемент не стоял рядом с таким же
то есть
x,y,z,y,x,y... - допустимо
x,y,y... - не допустимо

Вроде тривиальная задача.. но вот закавыка..

Всем спасибо!

samana 25.11.2013 15:10

Тогда ещё надо убедиться, что такой массив возможно создать. Допустим массив [x,x,y,y,y,y,y,y,y,y,z] невозможно так перемешать, так как "y" намного больше.

feelgood66 25.11.2013 15:21

Цитата:

Сообщение от samana (Сообщение 1153483)
Тогда ещё надо убедиться, что такой массив возможно создать. Допустим массив [x,x,y,y,y,y,y,y,y,y,z] невозможно так перемешать, так как "y" намного больше.

согласен абсолютно!
интересно, утверждение:
"сумма повторений любого элемента меньше половины длинны массива"
может считаться признаком того, что задача может быть выполнена?

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

samana 25.11.2013 15:27

По идее, сумма одинаковых элементов может быть "половина массива +1", что бы такой массив можно было правильно размешать.

feelgood66 25.11.2013 15:33

ну.. я бы даже сказал точнее - в зависимости от длины массива
если длина четная - то не более ровно половины
если нет - то допустимо половина + 1
вроде так
если смотреть "на пальцах"
то
[x,x,x,y,y,y] -> [x,y,x,y,x,y]
а вот
[x,x,x,x,y,y,] -> уже никак

зато
[x,x,x,x,y,y,y] -> [x,y,x,y,x,y,x]

Hauts 25.11.2013 15:37

Попробуйте так:

Код AS3:

var a:Array = [0,2,0,0,0,1,1,1,0,2,0,2,0,2,0,1,0,1,1,2,1,2,1,2,0,1,2,1,0,1];
 
 
function smartSort(array:Array):Array {
        var array:Array = array.concat().sort();
        var elements:Array = [];
        var elementsLengths:Array = [];
        var totalRendomElements:int = 0;
        var k:int;
        for (k = 0; k < a.length; k ++) {
                var el:* = array[k];
                var index:int = elements.indexOf(el);
                if (index == -1) {
                        totalRendomElements++;
                        elements.push(el);
                        index = elements.length - 1;
                        elementsLengths[index] = 0;
                }
                elementsLengths[index]++;
        }
        var maxGroupLength:int = elementsLengths.concat().sort()[0];
        var newArray:Array = [];
        for (k = 0; k < maxGroupLength; k ++) {
                for (var j:int = 0; j < totalRendomElements; j ++) {
                        elementsLengths[j]--;
                        if (elementsLengths[j] >= 0) {
                                newArray.push(elements[j]);
                        }
                }
        }
        return newArray;
}
 
trace(a)
trace(smartSort(a))

Особо не тестировал.

samana 25.11.2013 15:37

Цитата:

ну.. я бы даже сказал точнее - в зависимости от длины массива
если длина четная - то не более ровно половины
если нет - то допустимо половина + 1
Да, да, правильно. Всё надо проверять.

feelgood66 25.11.2013 15:46

Цитата:

Сообщение от Hauts (Сообщение 1153491)
Попробуйте так:

Особо не тестировал.

и что характерно - работает!
Гениально! Hauts, браво!
премного благодарен!

Hauts 25.11.2013 16:01

You are welcome.


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

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