как оптимизировать поисковую разницу между массивом / списком объектов - PullRequest
1 голос
/ 17 марта 2012

Premesis: Я использую ActionScript с двумя коллекциями массивов, содержащими объекты со значениями для сопоставления ...
Мне нужно решение для этого (если в рамках есть библиотека, которая делает это лучше), в противном случае любые предложения приветствуются ...

Давайте предположим, что у меня есть два списка элементов A и B (без повторяющихся значений), и мне нужно сравнить их и удалить все элементы, присутствующие в обоих, поэтому в конце у меня должно быть

  • в A все элементы, которые находятся в A, но не в B
  • в B все элементы, которые находятся в B, но не в A

Теперь я делаю что-то подобное:

            for (var i:int = 0 ; i < a.length ;)
            {
                var isFound:Boolean = false;
                for (var j:int = 0 ; j < b.length ;)
                {
                    if (a.getItemAt(i).nome == b.getItemAt(j).nome)
                    {
                        isFound = true;
                        a.removeItemAt(i);
                        b.removeItemAt(j);
                        break;
                    }
                    j++;
                }
                if (!isFound)
                    i++;
            }

Я циклически изменяю оба массива и, если я нашел совпадение, я удаляю элементы из обоих массивов (и не увеличиваю значение цикла, поэтому цикл for выполняется правильно)

Мне было интересно, есть ли (и я уверен, что есть) лучший (и менее потребляющий процессор) способ сделать это ...

1 Ответ

1 голос
/ 17 марта 2012

Если вам нужно использовать список, и вам не нужны возможности arraycollection, я предлагаю просто преобразовать его в использование векторов AS3.Согласно этому увеличению производительности (http://www.mikechambers.com/blog/2008/09/24/actioscript-3-vector-array-performance-comparison/) на 60% по сравнению с массивами. Я считаю, что массивы уже в 3 раза быстрее, чем ArrayCollections из одной статьи, которую я когда-то читал. К сожалению, это решение все еще O (n ^ 2) во времени.

Кроме того, причина, по которой Векторы работают быстрее, чем ArrayCollections, заключается в том, что вы предоставляете подсказку типа для ВМ. Виртуальная машина точно знает, насколько велик каждый объект в коллекции, и выполняет на этой основе оптимизацию.

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

Если вы хотите сделать НАМНОГО быстрее, чем это, используйте ассоциативный массив (объект в as3). Конечно, это может потребовать больше усилий по рефакторингу. Я предполагаю, что object.nome является уникальной строкой / idдля объектов. Просто назначьте это значение nome в качестве ключа в objectA и objectB.Таким образом, вам может не потребоваться циклически проходить по каждому элементу в каждом списке для сравнения.

...