0

PHP を扱った経験はあまりありませんが、ソーシャル ネットワークのフォロワー数の上位 10 人のユーザーを決定するための大まかなアルゴリズムを開発しました。ほぼ正しいと思われるユーザーのリストを返しますが、これには2つの問題があります。

  1. 特に多くのユーザーがいる場合は、非常に反復的でリソースを大量に消費するようです。ソート順を維持しながら、ユーザーが最後の位置よりも多くのフォロワーを持っていない場合、アルゴリズムを短絡する簡単な方法はありますか? アルゴリズムをどのように凝縮/簡素化できますか?

  2. それは正確には機能しません。返されるユーザーのリストは、上位 10 人のユーザーではありません。たとえば、スクリプトを実行すると、54、7、6、4、1、3、2、2、1、1 の順でフォロワー数のユーザーが返されるようになりました。フォロワー数が 54 を超えるユーザーが他に少なくとも 2 人いることを確認します。さらに、5 番目のユーザーは場違いです。これは私たちのアルゴリズムの問​​題ですか、それとも他の何かの問題ですか (おそらくフォロワーの保存方法)?

問題のコードは次のとおりです。

$array = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

$result = mysql_query("SELECT * FROM users") or die(mysql_error());;
for($i = 0; $user = mysql_fetch_array($result, MYSQL_NUM); $i++) {
    if      (following($user[0]) > following($array[0])) $array[0] = $user[0];
    else if (following($user[0]) > following($array[1])) $array[1] = $user[0];
    else if (following($user[0]) > following($array[2])) $array[2] = $user[0];
    else if (following($user[0]) > following($array[3])) $array[3] = $user[0];
    else if (following($user[0]) > following($array[4])) $array[4] = $user[0];
    else if (following($user[0]) > following($array[5])) $array[5] = $user[0];
    else if (following($user[0]) > following($array[6])) $array[6] = $user[0];
    else if (following($user[0]) > following($array[7])) $array[7] = $user[0];
    else if (following($user[0]) > following($array[8])) $array[8] = $user[0];
    else if (following($user[0]) > following($array[9])) $array[9] = $user[0];
}

この後、配列を MySQL テーブルに入力します。前もって感謝します。

編集: ここにフォロワー関数のコードがあります。

        function followers($id){
        $query = mysql_query("SELECT * FROM follow WHERE following='$id' AND follower!='$id'");
        return mysql_num_rows($query);
        }
4

3 に答える 3

1

考えられる解決策は 2 つあります。テーブル構造によって異なります。この場合、私は PHP でソートしません。SQL を使用すると、シンプルで高速です。

フォロワーが user テーブルに格納されている場合:

SELECT *                // try to avoid *
  FROM `users`
 ORDER BY followers DESC
 LIMIT 10

フォロワーが別のテーブルに保存されている場合(編集:構造に合わせて:):

SELECT u.user_id, COUNT(*) AS num_followers
  FROM `users` u, `follow` f
 WHERE u.user_id = f.following
 GROUP BY u.user_id
 ORDER BY COUNT(*) DESC
 LIMIT 10
于 2013-10-05T19:02:33.310 に答える