配列の要素が同じ回数繰り返されるかどうかを判断するアルゴリズムの正確さの証明


7

タイトルが長かったことをお詫びしますが、内容についての情報が欠けているので、どうやって別の書き方をするのか本当にわかりませんでした。

最近、並列アルゴリズムに関する大学の試験を受けました。1つの演習で、配列の要素(これを呼び出すとしましょうA)が同じ回数繰り返されているかどうかを判断するアルゴリズムを作成するように求められました。

例えば:

1)A = 1 8 8 1 8 1 1 8:答えは「はい」です。すべての数値が2回繰り返されます。

2)A = 7 8 8 5 5 4 7 8:答えはノーです。

並列計算の特定のモデルであるPRAMのアルゴリズムを作成する必要がありました。このモデルでは、読み取り/書き込みの競合やその他の問題を回避するためにいくつかの手法を使用する必要がありましたが、これは関係ありません。私が最終的に得たのは、新しい配列でしたB。それを次のように定義できます。Given the array A, B[i] contains the number of repetitions of the element A[i] within A.

例えば:

1) A = 1 8 8 1 8 1 1 8

B = 4 4 4 4 4 4 4 4

2)A = 7 8 8 5 5 4 7 8

B = 2 3 3 2 2 1 2 3

ご想像のとおり、残された唯一のことは、すべての要素がB他の要素と等しいかどうかを確認することですが、それは私がマゾヒストであり、試験のプレッシャーであることがわかりました温度)が私を別の道に導きました。さらに、このコンピューティングモデルを使用して、配列の要素を比較することはすぐにはできません。

したがって、のすべての要素Bが同じであるかどうかを確認するために、それらをすべて合計し、その結果を要素の数で除算しました。結果BがBの要素(たとえば、最初の要素)と等しい場合B[0]、アルゴリズムはtruefalseそれ以外の場合)。

上記の例を見てみましょう:

1)sum = 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 = 32-> 32 / 8 = 4 = B[0]->はい。

2)sum = 2 + 3 + 3 + 2 + 2 + 1 + 2 + 3 = 18-> 18 / 8 ≠ 2 = B[0]->いいえ。

馬鹿げていることは知っていますが、それが私が思いついたものです。

私はこのアプローチを配列/数値のさまざまな組み合わせで確認しましたが、うまくいくようです。ことは、アルゴリズムが正しいことの(数学的)証明を見つけるのに苦労していることです。私はまだ知らない試験の結果に加えて、このアプローチが正しいかどうかを示すいくつかの数学的証明/説明があるかどうかを知りたいと思っています。そのため、助けが必要です。

質問を右のStackExchangeサイトに投稿したことを望みます。そうでない場合は、適切なサイトにリダイレクトしてください。

前もって感謝します。


2
(3 + 2 + 4)/ 3 = 3はどうですか?
Yuval Filmus

@YuvalFilmus意味がわかりません。どういうわけか私の質問を誤解したと思います。
アレッサンドロ

回答:


11

いいえ、アルゴリズムは機能しません。配列Aが

A = [1 1 1 1 1 2 2 3 3 3 3 3 3]。

次に、配列Bは

B = [5 5 5 5 5 2 2 6 6 6 6 6 6]。

Bの合計は65で、Bの長さは13になるため、除算後、数値5が得られます。これはBの最初の要素に等しいため、アルゴリズムは「はい」を出力します。それでも、Bのすべての要素が同じであるとは限りません。正解は「いいえ」です。したがって、この場合、アルゴリズムは誤った出力を出します。

いいね!Bの構築方法を理解することは、おそらくこの問題の最も難しい部分でした。


私がこれを見つけた方法:2つの異なる数値を持つ反例を見つけることができなかったので、次に3つの異なる数値で試してみました。しましょうあなたvwこれらの数値のそれぞれが出現する頻度を示します。その後、配列は長さになりますあなた+v+w、およびBには値が含まれます あなた 繰り返される あなた 回、値 v 繰り返される v 回、そして w 繰り返される w 回なので、Bの要素の合計は あなた2+v2+w2。ディオファントス方程式の正の整数に対する解を見つけることができれば、反例を見つけることができます

あなた2+v2+w2あなた+v+w=あなた

そのような vあなた または wあなた。これは

あなた2+v2+w2=あなたあなた+v+w

どこ あなたvw 正の整数であり、 vあなた または wあなた。次に、いくつかの小さな値を選びましたあなたWolfram Alphaを使ってこのディオファンタス方程式を解いてみました。私がつまずいた最初の解決策はあなた=5v=2w=6、しかし他にもたくさんあります。振り返ってみると、私はさらに簡略化できたと思います

v2+w2=あなたv+あなたw

でも気づかなかったし、関係ないことがわかった。


ご説明ありがとうございます!私はすべてを理解しました。(悲しい:()
アレッサンドロ

5

[2,2,5,5,5,5,5,6,6,6,6,6,6]は反例です。

私がそれを見つけた方法:(これの最後のステップはPythonスクリプトでした。)すべてが等しくないためには、少なくとも2つの異なる数値が表示される必要があります。ただし、平均は厳密に最小値と最大値の間であるため、基準に合格するには、少なくとも3つの異なる数値が必要です。単に、3つの異なる数字のみの反例があるはずだと単に考えました。私が2つの文を前に挙げた理由から、3つの異なる数値のみで、平均が中間の数値であるかどうかを確認するだけで済みます。その観察に基づいて、[sum、largest、middle、smallest]の辞書式順序に関してトリプルを試すPythonスクリプトを作成しました。私が指定した配列は、スクリプトが見つけた最小の反例に対応しています。


いいね!これは正しくて役に立ちます。私はあなたがそれをどのように見つけたかの説明が好きです。それは本当に役立つようです。削除が一時的なものであることを願っています。削除を取り消すことを選択した場合は、喜んで反対票を投じます。
DW

(あなたに何も追加していないようでしたので、私は私を削除していた)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.