1

単語の「スコア」を計算して、Redisで並べ替えられたセット(アルファベット順にリストされた単語)の辞書式順序を決定するために使用しようとしています。

この投稿を読むと、次のように書かれています。

単語をスコアに変える方法は?

たとえば、最初の4文字を使用してスコアを生成する場合、次のルールが適用されます。

スコア=最初のバイト値*(256 ^ 3)+ 2番目のバイト値*(256 ^ 2)+ 3番目のバイト値*(256 ^ 1)+4番目のバイト値

単語の長さが4文字未満の場合は、存在しない文字を合計から省略してください。

なぜこれが機能するのですか?あなたはバイトをradis-256の数字の数字と見なしているだけです:)

この理論で、私はこれがPHP配列で機能するかどうかをテストするために次のコードを思いつきました。

$words = array('abcd', 'hello', 'dogs', 'hiya');
$newWords = array();

foreach ($words as $word) {
    $len = strlen($word);

    if ($len > 4) {
        $len = 4;
    }

    $i = 0;
    $j = $len - 1;
    $score = 0;

    while ($i < $len) {
        $byte = ord($word[$i]);

        if ($j == 0) {
            $score += $byte;
        }
        else {
            $score += $byte * (256 ^ $j);
        }

        $i++;
        $j--;
    }

    $newWords[$score] = $word;
}

ksort($newWords);
print_r($newWords);

ただし、これは次のようになります。

Array
(
    [75950] => abcd
    [80858] => hello
    [81124] => dogs
    [85220] => hiya
)

これはアルファベット順ではありません。

誰かが問題を見つけることができますか(明らかにスコアの計算は間違っています)?投稿を誤解した可能性があります:-/

4

1 に答える 1

2

コードを少し改善し、pow代わりに使用するように変更しました

$words = array('abcd', 'hello', 'dogs', 'hiya');
$newWords = array(); 
foreach ($words as $word) {

$len = strlen($word);

    if ($len > 4) {
        $len = 4;
    }

    $i = 0;
    $j = $len - 1;
    $score = 0;

    while ($i < $len) {
        $byte = ord($word[$i]);
        $score += $byte * pow(256, $j);
        $i++;
        $j--;
    }

    $newWords[$score] = $word;
}
ksort($newWords);
print_r($newWords);

それはあなたが期待したことを正確に行います:

Array ( [1633837924] => abcd [1685022579] => dogs [1751477356] => hello [1751742817] => hiya )

実際にXORhttp://www.php.net/manual/en/language.operators.bitwise.phpを使用しまし

于 2012-11-13T16:55:53.223 に答える