Ответы пользователя по тегу Алгоритмы
  • Какой использовать алгоритм обхода массива и сравнения каждого элемента с остальными в этом массиве?

    seyfer
    @seyfer Автор вопроса
    php
    Решение:

    Делаю обход массива, создаю хеш таблицу. По ходу обхода ищу в хеш таблице по хешу элемент, если не нашел то добавляю его как уникальный.
    Если нашел, то сравниваю с найденным и по результату либо иду дальше, либо заменяю найденный на текущий.

    profit

    Для решения задачи после всех советов я пошел следующим путем.
    Если принять H за таблицу хешей, а h() - ф-ю создающую хеш, то мой итоговой алгоритм выглядит так.

    Замечу еще, что структура несколько сложнее, чем просто элементы в массиве.

    someMethod(array) {
    
    finalResult = [];
    H = [];
    //итерируюсь по элементам.
    foreach (array as resultKey => resultElement) {
       resultArray = resultElement['result'];
       resultInfo = resultElement['request'];
       
       //тут проверки на корректность
       ...
    
       //далее итерируюсь по внутреннему массиву
       foreach(resultArray as currentElement) {
       
       currentHash = h(currentElement);
    
       if (!H[currentHash]) {
           //нету в таблице
           //добавляю в рез-т
           currentUniqueId = currentElement['unique'];
           finalResult[resultKey]['result'][currentUnique] = currentElement;
           
           //запоминаю, чтобы можно было удалить в будущем
           currentElement['resultKey'] = resultKey;
           //добавяю в хеш таблицу
           H[currentHash] = currentElement;
       } else {
           //уже есть в таблице
           hashedElement = H[currentHash];
           currentUniqueId = currentElement['unique'];
           hashedUniqueId = hashedElement['unique'];
     
          //не сравниваем сам с собой
          if (compareUnique(currentUniqueId, hashedUniqueId)) {
             continue;
           }
    
           //дальше сравнение
           if (compareBigger(currentElement, hashedElement)) {
                //текущий больше, ничего не делаем
           } else if (compareSmaller(currentElement, hashedElement)) {
               //не буду приводить код, просто действия
               /*
               1. Удалить текущий из рез-та fullResult
               2. Сохранить currentElement в fullResult
               3. Обновить H[currentHash] на текущий элемент
    
              */
           }       
       }
       }
    }
    
    return fullResult;
    }


    В оригинале код конечно же разбит на ф-ии и методы, тут упрощено все для примера.
    У меня получается за один проход выходит рез-т, только памяти больше занимается. :)
    Ответ написан
    Комментировать