За последние 24 часа нас посетили 201449 программистов и 2096 роботов. Сейчас ищет 1801 программист ...

Как быстро найти повторяющийся элемент в массиве ???

Тема в разделе "PHP для новичков", создана пользователем Guliver, 7 мар 2015.

  1. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Привет всем! Ребята подскажите правильно ли я мыслю или можно куда быстрее решить задачу? Есть массив от 1 до 1000000. В этом массиве все числа уникальные, кроме одного числа, которое повторяется два раза. Найти это число.
    Решить эту задачу с минимальным использованием процессорного времени.


    Мой вариант:
    Код (Text):
    1. <?php
    2.    
    3.    
    4.     for ($i = 1; $i <= 100000; $i++)
    5.         {
    6.             $array[$i] = $i;
    7.         }
    8.             $array[$i+1] = 8;
    9.        
    10.            
    11.    
    12.     define("START_TIMER", microtime(true));
    13.    
    14.     $numberlist_new = array_count_values ($array);
    15.    
    16.     foreach($numberlist_new as $k => $v)
    17.     {
    18.         if ($v > 1) {
    19.         echo "Мы нашли повторяющееся число: <b>$k</b></br>\n";    
    20.         }
    21.        
    22.     }
    23.    
    24.     printf("Время работы скрипта: %.5f с", microtime(true)-START_TIMER);
    25.  
    26. ?>
    Время работы скрипта: 0.03120 сек.

    Добавлено спустя 3 минуты 13 секунд:
    Кстати памяти не хватает на массив 10 (6). Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Так поищи алгоритмы для поиска дублей в массивах, почитай какие есть функции для работы с массивами в php, увеличь память если не хватает.
     
  3. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Ну то, что я придумал - я написал выше. А увеличивать запас ОЗУ не хотелось бы, т.к в будущем можно обезопасить себя от возникновения подобной проблемы.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Но ты поискал сам в поиске какие ещё бывают алгоритмы и подходы?
    Чтобы снизить потребление ОЗУ, можно частями проверять массив,
    почитай про фильтр блума, возможно поможет
     
  5. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Я уже второй день читаю, кто-то предлагает для работы с большими массивами метод битовых карт, кто-то метод сравнения. Много похожих задач в нете. С некоторыми решениями я крайне не согласен, некторые алгоритмы, которые мне удалось найти - работаю медленнее моего. Хотя при 10 * в 6 степени мой тоже уступать стал одному из вариантов.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1. <?php
    2. $input = array('1', '2', '3', '4', '5', '6', '7', '7',);
    3.  
    4. $array_counts = array_count_values($input);
    5.  
    6. $flip = array_flip($array_counts);
    7.  
    8. foreach ($flip as $key => $value) {
    9.     if ($key > 1) {
    10.         echo "duplicate: ".$value;
    11.     }
    12. }
    13. ?>
     
  7. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Я в своем примере тоже использую array_count_values. Но при n=1000000 , вот эта функция быстрее рабтает :
    Код (Text):
    1. function search_deplicate($array) {
    2.     $hash = array();
    3.     foreach ($array as $val) {
    4.         if (isset($hash[$val])) {
    5.             return $val;
    6.         }
    7.         $hash[$val] = true;
    8.     }
    9.     return null;
    10. }
    Добавлено спустя 5 минут 31 секунду:
    Ваш вариант, крут 0.30160 с

    Добавлено спустя 10 минут 18 секунд:
    Спасибо за помощь!!!
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    массив поди из базы? БД управляется с большими данными получше пхп.
     
  9. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Нет. Это просто задачка такая, которую нужно решить с минимальным использованием процессорного времени.