アルゴリズムに関する質問です。
以下の問題をO(n)の時間で解くには、どのような方法を使えばいいのでしょうか?
どうぞよろしくお願い致します。
【問題】
とある店でm人いる顧客のうち、n人から契約更新の届けが来ました。
店側から届けが来ていない顧客(m - n人)へ契約更新のお知らせを出したいのですが、店にはソートされていない顧客の名前リストと、こちらもソートされていない契約更新をしたn人の名前リストしかありません。
m=nだった場合は”なし”と、m>nだった場合は契約更新をしていない顧客の名前を一人分アウトプットとして返しなさい。
No.6ベストアンサー
- 回答日時:
#2, #4です。
失礼しました。とんでもない勘違いをしてました。#4は間違いです。無視してください。
で、m人の顧客の検索がO(n)であるという理由ですが、
m>nだとして、m人のうちn人だけを検索します。
そのなかに1人でもハッシュテーブルにない顧客がいれば、それをアウトプットすればいい。
もしn人全員がハッシュテーブルに存在したとすれば、残りの顧客(m-n人)はすべて契約更新していないのだから、その中から適当に1人を選んでアウトプットすればいい。
いずれにしても、m人全員を検索する必要はなく、多くともn人の検索で充分なのでオーダーはO(n)になります。
お礼を申し上げるのが大変遅くなってしまい、申し訳ございません。
nag0720様のおかげでどうしてハッシュテーブルを使えばO(n)時間で探索が完了出来るのか分かるようになりました。
丁寧に回答して下さって、感謝してもしきれません。
本当にありがとうございました!
No.7
- 回答日時:
残念ながら外れ.
大きな間違いは, 再帰の部分で計算量を nlogn としちゃってるところ. 確かに最悪 O(log n) 回の再帰が必要だから全体で O(n log n) となりそうなんだけど, 再帰をするごとにリストが短くなることを考慮して計算し直せばきっちり線形時間で終らせることができる. 解析は選択アルゴリズムと本質的に同じなので, 疑問に思ったら確認してみるといい (ただし Wikipedia の説明はちょっと日本語がこなれてないので読みにくいかも).
あとは細かいところで
・リスト全体の中央値を使うかわりにリストのまんなかにある値を使うと最悪の場合に計算量が大きくなるのでダメ (ここも本質は選択アルゴリズムと同じ: ここで線形時間使っても, アルゴリズム全体の時間は線形時間のまま)
・リストを m にすることに意味はない (リストの長さを 2n+1 にすることができる, というのは #6 の説明の通り)
というところかな.
あ, もちろん「想定する答え」は「ハッシュ」だと思うよ. というか, ハッシュ以外のアルゴリズムを想定するかなぁ, ふつう....
お礼を申し上げるのが大変遅くなってしまい、申し訳ございません。
ゆっくり時間をかけて考え、計算したところ、Tacosan様がおっしゃっていたように線形時間で終わるアルゴリズムを作る事が出来ました。
細かい部分まで丁寧に説明して下さってどうもありがとうございました。
とても説明が分かりやすく、アルゴリズムが苦手な私にとっては大変ありがたかったです!
No.5
- 回答日時:
確認だけど, 「n個のデータの中央値が O(n) 時間で求まる」のはいいよね? それを前提に, 基本的な形 (ただしこの問題の答えではない) を書くとこんな感じ:
0. m = n だったら考えるまでもないので m > n の場合だけ考える.
1. 以下, もともとの「m人の顧客リスト」を「リスト1」, 「契約更新をした n人のリスト」を「リスト2」と呼ぶことにする.
2. 2つのリストをまぜて長さ m+n のリストを作る (どちらから来たデータであるかはわかるようにしておく).
3. このリストの中央値を見つける.
4-1. 中央値のデータがリスト1 から来た場合:
4-2. 同じ名前を持つリスト2 のデータを探す. あればそれらのデータを削除する, なければ「契約更新をしていない顧客の名前」が見付かったことになるので終了.
4-2': 同じ名前を持つリスト1 のデータとともに削除する.
5. (削除してしまった) 中央値でリストを二分する. 前半と後半のうち, どちらかは「リスト1 から来たデータの方が多い」ので, そちらに対して 3 以降を再帰的に実行する.
とここまで書いて次に宿題を出しておこう:
・このアルゴリズムの計算量は O(n) ではありません. 実際にはいくつでしょうか?
・計算量を O(n) にするにはいくつかの部分を修正する必要があります. どうすればよいでしょうか?
ちなみに計算量に関する #4 の記述は大嘘なので, 見なかったことにするか直ちに記憶から消去することをお勧めします.
この回答への補足
ご回答ありがとうございます!
以下、私が考えた宿題の回答(途中まで)です。
このアルゴリズムでしたら、中央値を見つけるのにO(m+n)時間、4-2がワーストケースでO(n)時間、5は二分探索のようなものなのでO(log(m+n))時間、計O(m+n+nlogn)時間かかると考えました。
それをO(n)にするには、私は今回は数値ではなく文字列を扱っているので、まず中央値を見つけようとするのではなくリストの中心にあるアイテムを中央値にする事にしました(O(1))。
またリストはm+nではなくmのみにしようかと思います。
ただ、どうしても再起部分のnlognが残ってしまって、そこを解決する方法がまだ思いついていません。
よろしければヒントを下さりませんか?
No.4
- 回答日時:
>m人の顧客を検索するのはO(m*1)でO(m)になる事はないのでしょうか?
計算量O( )の表記は、O(nの式)で表現します。
このnは「n人の名前リスト」のnとは全然関係ありません。
計算量が計算サイズに比例するとき、計算量のオーダーをO(n)と表記します。
計算量が計算サイズの2乗に比例するなら、O(n^2)と表記します。
m人だからと言って、O(m)と書くことはしません。この場合でもO(n)と表現します。
質問のはじめにあった「以下の問題をO(n)の時間で解くには、・・・」のO(n)のnは、契約更新した人数のことではありませんよ。単なるオーダーの記法です。
No.2
- 回答日時:
>私は最悪O(mn)時間かかるのではないかと思ったのですが、
最悪というのはどういう場合でしょうか?
もしかして、ぜんぶ衝突した場合?
もしそうなら、それはハッシュ関数が最悪なだけですから、もっとましなハッシュ関数を作るしかないですね。
n人のハッシュテーブルを作成するのにO(n)、
ハッシュテーブルさえできればその検索のオーダーはO(1)です。
あとは、m人の顧客を検索するだけですからオーダーはO(n*1)=O(n)
ということで、O(n)+O(n)=O(n)
この回答への補足
再度の回答をありがとうございます!
最悪というのは、ワーストケースの事を言っているつもりでした。
言葉足らずですみません。
m人の顧客を検索するのはO(m*1)でO(m)になる事はないのでしょうか?
O(n)+O(m)だとO(m)になってしまうので、ハッシュテーブルでは出来ないという事になるんでしょうか。
ハッシュの知識があまりないので間違っていたら申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ソフトウェア) 現在と過去の顧客名簿、新規・解約・更新など作りたいのですが「やよいの顧客管理」なら簡単に扱えますか? 1 2022/05/18 10:44
- 借地・借家 定期借家契約の期間満了解約についてご教示ください。 4 2023/02/02 19:02
- 営業・販売・サービス トラブル客の来店時の対応 私は令和2年~毎年勤務先の人材派遣会社で契約先のスズキディーラーの初売りの 1 2023/01/03 09:53
- 派遣社員・契約社員 契約社員の更新時期について 1 2022/07/26 12:16
- 経営情報システム 顧客管理ソフト、どうやって選べばいいのですか? 3 2022/05/15 22:01
- 経営情報システム 起業とサービス価格設定 3 2023/04/12 11:29
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- 会計ソフト・業務用ソフト 事業内容に適した、見積・請求書・顧客管理ソフト、システムを探しています。 2 2022/11/11 13:28
- ハローワーク・職業安定所 失業保険の特定理由離職者に当てはまるか知りたいです。 パートで3ヶ月おきに更新しており1年半勤務して 7 2022/08/25 17:12
- 消費者問題・詐欺 お金を取り返すことは可能でしょうか? 4 2023/01/07 13:17
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルデータ。容量を減らす...
-
Excel 指定した固有番号で、複...
-
EXCELシート内の数字での並び替...
-
VBA リストボックス反映できない
-
Excel関数VLOOKUPについて
-
リストボックスから削除、「い...
-
エクセルで「3次元配列」表の...
-
VBA。リストボックスの値を別の...
-
データ型が一致しない?
-
エクセルのマクロで他のファイ...
-
あるセルに文字が入力されてい...
-
顧客CDのCDって?
-
読み取ったQRコード/バーコード...
-
EXCELでバーコードを作成すると...
-
バーコードってダブらない?
-
QRコードとバーコードについて
-
Qoo10のコンビニ受け取りをして...
-
クロネコメール便での発送
-
レジでピッとするやつ
-
レシートにバーコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで「3次元配列」表の...
-
<新設税理士事務所です>ミロ...
-
顧客CDのCDって?
-
VBA。リストボックスの値を別の...
-
エクセルで並び替えするとハイ...
-
エクセルの数式で教えてください。
-
エクセルVBA テキストボックス検索
-
VBA リストボックス反映できない
-
EXCELシート内の数字での並び替...
-
エクセルで顧客の継続率
-
Excel 指定した固有番号で、複...
-
アクセスでのデータ抽出方法
-
対象月の2桁表示について
-
エクセルでのデータ作成(数値...
-
顧客名簿管理、郵便振込取扱票...
-
エクセルでのデータ拾い
-
エクセルデータ。容量を減らす...
-
【ExcelVBA】顧客別に抽出デー...
-
お客さんの来店間隔が知りたい...
-
顧客データと請求書、売上帳を...
おすすめ情報