質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

659閲覧

計算量のlogCの出どころを知りたい。

SmaSTATION

総合スコア29

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2022/11/20 05:22

前提

下記に示すプログラムの計算量を知りたいです。
解答では、(NlogNlogC)となっています。
NlogNまでは、二分探索とソートの処理というめぼしはつくのですが、logCの行方がわからず困っております。

該当のソースコード

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4using namespace std; 5 6int main() { 7 long long N, K; 8 cin >> N >> K; 9 vector<long long> a(N), b(N); 10 for (int i = 0; i < N; ++i) cin >> a[i]; 11 for (int i = 0; i < N; ++i) cin >> b[i]; 12 13 // b はあらかじめソートしておく 14 sort(b.begin(), b.end()); 15 16 // 判定問題 17 auto check = [&](long long x) -> bool { 18 long long cnt = 0; 19 for (int i = 0; i < N; ++i) { 20 cnt += upper_bound(b.begin(), b.end(), x / a[i]) - b.begin(); 21 } 22 return (cnt >= K); 23 }; 24 25 // 二分探索 (right は十分大きな値に設定) 26 long long left = 0, right = 1LL<<60; 27 while (right - left > 1) { 28 long long mid = (left + right) / 2; 29 if (check(mid)) right = mid; 30 else left = mid; 31 } 32 cout << right << endl; 33}

試したこと

再度ひとつずつ、計算量を見てみるも、N、logNしか見当たらずでした。

補足情報(FW/ツールのバージョンなど)

解説には最大値とありますが、そもそもプログラム内にmax関数なんて使っていないような気がしています...
参考にした解説ページ
リンクに飛べます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

checkにNlogNかかるのはループ構造から自明とおもいます。
問題は外側のwhileが何回回るかで、このプログラム例ではrightの初期値は1<<60なので60回なわけですが、これがlogCに相当します。
というのもrightはmax(a)×max(b)が上限だからです。実際の値から求めてもいいですが、a,bの最大は1e9である前提なので2^30(1.07e9)で近似して2^60が出てくるわけです。

投稿2022/11/20 12:24

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あまく詳しくないので,間違っているかもしれませんが,
logCは比較処理,具体的にプログラムの中では「if check(mid)...」の回数に関係するものだと思います。
値の比較処理自体,乗除加算と同様に演算時間がかかります。

投稿2022/11/20 05:57

ujimushi_sradjp

総合スコア2087

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問