2

SQlite6 つのアイテムを連続して挿入する必要があるテーブルがあります。そして、そのような行が4000あります。したがって、4000 * 6 回の挿入操作が必要です。それを減らすために、これらの 6 つの項目を連結して 1 つの列として挿入すると、操作は 4000 回しかありません。

O(n^2)しかし、文字列連結操作の複雑さは、n が文字列の番号であることがわかりました。アイテムをフェッチするときは、文字列を 6 つの部分に分割する必要があります。逆に、挿入/クエリなどのデータベース操作には、構造M * O(log(n))を維持するため、M が行数、n が列であるという複雑さがあります。B-tree

それで、私は今何をすべきですか?6 つの項目を 1 つに連結して挿入し、後で分割する必要がありますか、それとも 6 つの列に挿入して 6 回の試行でクエリを実行する必要がありますか? 時間効率が良いのはどれ?

4

2 に答える 2

2

アルゴリズムの複雑さの見積もりはすべて間違っています。

文字列連結を実装する最も簡単な方法は O(n²) だけです。SQLite がレコードを作成するとき、文字列の数と大きさが既にわかっているため、部分的な文字列を再割り当てしたり移動したりする必要はありません。1 つのレコードを作成するのに必要な実際の時間は O(n) です。(これは文字列のサイズを無視しますが、すべての文字列が同じサイズであると仮定すると、これは問題になりません。)

SQLite が複数の文字列を挿入する場合でも、テーブルの B ツリーに挿入される前にレコードを構築します。

B-tree の任意の位置に 1 つのレコードを挿入すると、O(log M) になります。レコードを追加するだけなら、それは O(1) です。


数値 n と M は無限に大きくなるわけではなく、制限されていることに注意してください。したがって、定数しかないため、実際にはすべての時間は O(1) になります。あなたにとって重要なのは、O 表記によって隠されている定数要素です。それらを見つける唯一の方法は、実際に運用を測定することです。

于 2013-08-03T14:50:26.877 に答える
1

SQLiteクエリをフィルタリングしてデータをより簡単に管理できるので、私は を好みます。

String 連結の 1 つの列を変更または削除する必要がある場合はどうでしょうか? Stringデータを分割し、変更/削除したいものを見つけて、データベースに再挿入する必要があるため、これはより複雑になります。

「6回の試行でそれらをクエリする」必要がある理由がわかりませんでした(1つずつクエリするつもりでしたか?):単純なクエリを使用すると、必要なすべてのデータを含むカーソルを作成できます。

于 2013-08-03T08:31:33.320 に答える