Как вычислить % сходства массивов?

Discussion in 'PHP' started by Student :), 23 May 2013.

  1. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    Как вычислить % сходства массивов?
    вот первый
    PHP:
    $ar1=Array(
    '011111110',
    '000000110',
    '000000110',
    '000001100',
    '000011100',
    '000011000',
    '000111000',
    '000110000',
    '001110000',
    '001100000',
    '000000000',
    )
    вот второй
    PHP:
    $ar2=Array(
    '111111100',
    '000001100',
    '000001100',
    '000011000',
    '000111000',
    '000110000',
    '001110000',
    '001100000',
    '011100000',
    '011000000',
    '000000000',
    );
    array_diff не подходит ((
     
  2. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    я не помню, какие у вас там стандартные функции есть, но если процент сходства массивов это то, что я думаю, то сравнивай поэлементно и записывай количество совпадений. затем умножай это число на 100 и дели на количество элементов в массиве.

    ну что то вроде этого:
    PHP:
    $diff 0;
    for(
    $i 0$i $array_size; ++$i)
    {
         if(
    $arr1[$i] == $arr2[$i])
              
    $diff++;
    }

    $result = ($diff 100) / $array_size;
    print 
    $result;
    расценивай это как всевдокод, ибо у меня языковой барьер :D
     
  3. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    СПАСИБО ПОПРОБУЮ, ЭТО Я АНТИКАПЧУ ВОЯЮ )))
     
  4. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    чото не то, я думаю надо сравнивать построчно количество 1
     
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    опять же смотря что тебе нужно. я привел пример для определения на сколько процентов 2 массива строк эквивалентны.

    ты можешь сравнить количество единиц в каждой строке, оно может совпасть, но их расположение может быть разное. типа 1010 и 0011 не одно и тоже. не знаю на сколько для тебя это имеет значение.
     
  6. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    лучше чтоб было 00011110 и 001111001
    это 90%
     
  7. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    даже 95 %
     
  8. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    помогите курсовая горит (
     
  9. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    Почти сутки не сплю, вот такой вариант )
    PHP:
    function array_compare($arr1$arr2) {
        
    $result 0;
        
    $pre 0;
        if(
    count($arr1) != count($arr2)) return 'error';
        foreach(
    $arr1 as $index => $value) {
            if(isset(
    $arr2[$index])) {
                
    $value2 $arr2[$index];
                if(
    strlen($value2) == strlen($value)) {
                    if(
    $value2 === $value) {
                        
    $pre += 100;            
                    }else {
                        
    $k 0;
                        
    $len strlen($value);
                        for(
    $i 0$i $len$i++) {
                            if(
    $value[$i] == $value2[$i]) $k++;
                        }
                        
    $pre += round($k $len 100);
                    }
                }
            }
        }
        
    $result $pre / (count($arr1) * 100) * 100;
        return 
    $result;
    }

    echo 
    array_compare($ar1$ar2);
     
  10. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    Как тут может быть 95% если всего 5 из 8 символов совпадают. А это ~ 60%
     
  11. Student :)

    Student :) Elder - Старейшина

    Joined:
    9 Feb 2007
    Messages:
    278
    Likes Received:
    18
    Reputations:
    -15
    LStr1ke! Спасибо тебе большое!!! Выручил!
     
  12. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Для скорости оба массива можно отсортировать.
    Потом идем по сортированным массивам и если текущий элемент из А меньше - то его пропускаем. Если текущий элемент В меньше - пропускаем его. Если они совпадают, то увеличиваем счетчик совпадений и пропускаем оба.

    Получится скорость O(n*log n), а без сортировки всего O(n^2)