CareerCupで Google インタビューの質問を見つけました
2D 平面が与えられ、そこに約 6000 の点があるとします。最も多くの点を通過する直線を見つけます。
そこにある多くの回答は、この質問は難しく、ある種の特別なアルゴリズムが関係していると言っています。
しかし、私の見解は異なり、おそらく私は間違っています。
ここに私の考えがあります:
まず、2D 平面に座標系を与えます。したがって、すべてのポイントには一意の x と y があり{x, y}
ます。簡単にするために、座標系を{0, 0}
平面全体の左下に置くことができます。したがって、すべての x と y は 0 より大きくなります。
それから私は理論を持っています:
複数の点が同じ線上にある場合は、次の 3 つのケースのいずれかである必要があります。
- それらの
x
値は同じです - それらの
y
値は同じです x/y
またはy/x
値は同じです。しかし、x/y
ケースはケースと同じy/x
なので、 だけに注目しましょうx/y
。
次に、3 つのハッシュテーブルを作成します。
最初のもの (
hashtable-x
) は のキーでx
、値は同じ を持つポイントのリストx
です。2 番目のもの (
hashtable-y
) は のキーでy
、値は同じを持つポイントのリストy
です。- 最後の (
hashtable-x-y
) は のキーでx/y
、値は同じを持つポイントのリストx/y
です。
次に、6000 ポイント全体をスキャンします。各ポイントについて、x
から取得し、そのhashtable-x
ポイントをそのスロットの値 (リスト) に入れます。次に、 と と同様のことをhashtable-y
行いhashtable-x-y
ます。
最後に、3 つのハッシュテーブルのすべてのリストをスキャンし、最も長いリストに目的のラインのポイントが含まれていることを確認します。
私のアルゴリズムをどう思いますか?
わかりました、ここに重複があります。以前にその質問を見つけられなかったことをお詫びします。