Misalkan kita memiliki semigroup dengan elemen S = { s 1 , s 2 , ... , s n } . Tujuan kami adalah menghitung produk s i ∘ s i + 1 ∘ ⋯ ∘ s j .
Dalam makalah mereka "Pemrosesan yang Optimal untuk menjawab pertanyaan produk on-line" Alon dan Schieber membuktikan bahwa kita dapat menjawab setiap permintaan seperti itu di paling banyak langkah (di mana α adalah fungsi Ackermann terbalik) dengan hanya menggunakan jumlah linier preprocessing.
Jika diinginkan bahwa setiap kueri dapat dijawab dalam langkah O ( log ( j - i ) ) , dapatkah seseorang masih melakukan ini dengan hanya preprocessing linier?
(Pertanyaan ini terinspirasi oleh ini pertanyaan terbaru oleh Brendan McKay di Mathoverflow.)
cc.complexity-theory
graph-theory
ds.data-structures
Gjergji Zaimi
sumber
sumber
Jawaban:
Bangun pohon biner seimbang teratur dengan di daun (dalam urutan). Di setiap simpul internal v simpan produk daun subtree yang berakar pada v . Preprocessing ini jelas berjalan dalam O ( n ) waktu dan ruang.s1, … , Sn v v ( n )
Sekarang, untuk menghitung suatu produk (di mana i < j ) berjalan di atas pohon dari i ke leluhur yang paling tidak umum (LCA) dari i dan j . Kumpulkan produk yang disimpan di setiap anak kanan yang menggantung di jalan, tidak termasuk anak kanan LCA. Dengan kata lain, saat Anda naik dari Anda ke induknya v , jika Anda adalah anak kiri dari v , kemudian mengambil produk yang disimpan di anak kanan v . Demikian pula, berjalan dari jssaya∘ … ∘ sj saya < j saya saya j kamu v kamu v v j ke LCA dan mengumpulkan produk yang disimpan pada anak-anak kiri yang tergantung di jalur itu. Lipat gandakan semua produk ini, bersama dengan dan s j secara berurutan.ssaya sj
sumber