Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Фунция поиска минимума
 
 автор: sidPR   (08.02.2008 в 13:21)   письмо автору
 
 

Пример $arr :


Array
(
    [0] => Array
        (
            [word] => груша
            [count] => 0
        )

    [1] => Array
        (
            [word] => яблоко
            [count] => 0
        )

)


надо среди многомерного массива найти наименьший count и вернуть индекс.

function min_r($arr){
    $min = $arr[0]['count'];
    for($i=0;$i<count($arr);$i++){
        $arr_r[$arr[$i]['count']][] = $i;
        if($arr[$i]['count']<$min){
            $min = $arr[$i]['count'];
        }
    }
    return $arr_r[$min];
}
//пример использования:
$s_rand = min_r($arr);
$rand = $s_rand[rand(0,count($s_rand)-1)];  // случайным образом выбирается индекс из наименьших.




с помощью данной функции возникает перегруз Allowed memory size of 8388608 bytes exhausted. при обработки большого кол-во массивов в цикле используется данная функция поиска минимума.

Надо както оптимизировать ее работу .. но как я не могу придумать.
Поможите люди с оптимизацие процесса...

   
 
 автор: MIchail1982   (08.02.2008 в 13:36)   письмо автору
 
   для: sidPR   (08.02.2008 в 13:21)
 

function min_r($arr)
    {
    $index = 0;
    $min = $arr[$index]['count'];
    for($i=1;$i<count($arr);$i++)
        {
        if ($arr[$i]['count']<$min)
            {
            $min = $arr[$i]['count'];
            $index=$i;
            }
        }
    return $arr[$index];
    }

   
 
 автор: sidPR   (08.02.2008 в 13:56)   письмо автору
 
   для: MIchail1982   (08.02.2008 в 13:36)
 

не работает ваша функция :( я на выходе должен получить чтото типо

Array
(
    [0] => 0
    [1] => 1
)

   
 
 автор: MIchail1982   (08.02.2008 в 14:25)   письмо автору
 
   для: sidPR   (08.02.2008 в 13:56)
 

я из неё получил
Array
(
    [count] => 2
    [word] => word_0
)

   
 
 автор: sidPR   (08.02.2008 в 14:28)   письмо автору
 
   для: MIchail1982   (08.02.2008 в 14:25)
 

нет мне нужне результат массив с минимальными индексами .

2 2 3 4 => будет массив с 2 2 соответсвенно индексы этих минимумов

2 1 3 4 = > будет только 1

3 3 3 3 => будет 3 и так далее

а на выводе будет массив с индексами

   
 
 автор: MIchail1982   (08.02.2008 в 14:37)   письмо автору
 
   для: sidPR   (08.02.2008 в 14:28)
 

так?
function min_r($arr)
    {
    $min = $arr[0]['count'];
    for($i=1;$i<count($arr);$i++)
        {
        if ($arr[$i]['count']<$min)
            {
            $min = $arr[$i]['count'];
            unset($index);
            $index[]=$i;
            }
        elseif ($arr[$i]['count']==$min)
            {
            $index[]=$i;
            }
        }
    return $index;
    }

   
 
 автор: sidPR   (08.02.2008 в 15:33)   письмо автору
 
   для: MIchail1982   (08.02.2008 в 14:37)
 

Вообще перестал работать :)

   
 
 автор: MIchail1982   (08.02.2008 в 16:16)   письмо автору
 
   для: sidPR   (08.02.2008 в 15:33)
 

function min_r($arr)
    {
    $min = $arr[0]['count'];
    $index[]=0;
            for($i=1;$i<count($arr);$i++)
        {
        if ($arr[$i]['count']<$min)
            {
            $min = $arr[$i]['count'];
            unset($index);
            $index[]=$i;
            }
        elseif ($arr[$i]['count']==$min)
            {
            $index[]=$i;
            }
        }
    return $index;
    }

   
 
 автор: sidPR   (08.02.2008 в 16:36)   письмо автору
 
   для: MIchail1982   (08.02.2008 в 16:16)
 

а чем моя функция хуже в таком случае чем ваша ?

   
 
 автор: Shiva   (08.02.2008 в 16:52)   письмо автору
 
   для: sidPR   (08.02.2008 в 16:36)
 

Ваша хранит данные об индексах всех элементов, дублируя их в памяти. А функция MIchail1982 - только об индексах предполагаемого наименьшего элемента, в каждый отдельный момент времени. У вас ведь проблема и была в превышении лимита ОП.

   
 
 автор: sidPR   (08.02.2008 в 16:59)   письмо автору
 
   для: Shiva   (08.02.2008 в 16:52)
 

MIchail1982 Спасибо.. но не помогло видимо другие функции тоже построены не правильно и оч много хранят в себе что скрипт не справляется :(

   
 
 автор: MIchail1982   (08.02.2008 в 17:20)   письмо автору
 
   для: sidPR   (08.02.2008 в 16:59)
 

моя функция работает с 350000 записей(на 400000 загибается)
попробуйте разбить ваш массив на куски
$new_arr = array_chunk($arr, 10000, TRUE);
foreach ($new_arr as $arr_2)
    $temp = min_r($arr_2);

и потом взять и сравнить минимальные элементы

   
 
 автор: Shiva   (08.02.2008 в 17:23)   письмо автору
 
   для: MIchail1982   (08.02.2008 в 17:20)
 

Это зачем? Чтобы еще под $new_arr память отвести?
С подавляющей вероятностью, проблема с памятью теперь не в этой функции, а в других частях файла.

   
 
 автор: sidPR   (08.02.2008 в 17:30)   письмо автору
3.5 Кб
 
   для: Shiva   (08.02.2008 в 17:23)
 

Вложил в пост листинг программы ...

   
 
 автор: sidPR   (15.02.2008 в 12:52)   письмо автору
 
   для: sidPR   (08.02.2008 в 17:30)
 

function min_r($arr) 
    { 
    $min = $arr[0]['count']; 
    $index[]=0; 
            for($i=1;$i<count($arr);$i++) 
        { 
        if($arr[$i]['count']<$min){ 
            $min = $arr[$i]['count']; 
            unset($index); 
            $index[]=$i; 
            } 
        elseif ($arr[$i]['count']==$min){ 
            $index[]=$i; 
             } 
        } 
    return $index; 
 }



[Fri Feb 15 12:48:28 2008] [error] PHP Notice:  Undefined offset:  12 html/index.php on line 62
[Fri Feb 15 12:48:28 2008] [error] PHP Notice:  Undefined offset:  12 html/index.php on line 63



62  if($arr[$i]['count']<$min){ 
63          $min = $arr[$i]['count'];


Где ошибка ?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования