サイズがNのN個の配列があり、それらがすべてソートされている場合、余分なスペースを使用できない場合、どのようにしてそれらの共通データを効率的に、または時間の複雑さを抑えて見つけることができますか?
例:
1. 10 160 200 500 500
2. 4 150 160 170 500
3. 2 160 200 202 203
4. 3 150 155 160 300
5. 3 150 155 160 301
これはインタビューの質問です。似たような質問がいくつか見つかりましたが、入力が並べ替えられたり、追加のメモリを使用できないという追加の条件が含まれていませんでした。
O(n ^ 2 lg n)の複雑さよりも小さい解決策は考えられませんでした。その場合、私はこの複雑さを私に与える最も単純な解決策を選びたいと思います。それは次のとおりです。
not_found_flag = false
for each element 'v' in row-1
for each row 'i' in the remaining set
perform binary search for 'v' in 'i'
if 'v' not found in row 'i'
not_found_flag = true
break
if not not_found_flag
print element 'v' as it is one of the common element
各行の最小値と最大値を比較し、それに基づいて、数値「num」がその行の「min_num」と「max_num」の間に入る可能性があるかどうかを判断することで、これを改善できます。
二分探索->O(log n)n-1行の1 numを検索する場合:O(nlogn)最初の行の各数値の二分探索:O(n2logn)
最初の行を選択しました。任意の行を選択できます。選択した行の要素が(N-1)行のいずれにも見つからない場合、実際には共通のデータがありません。