düzenleme: Bu cevap siparişler-of-büyüme, bir sıkıştırma algoritması istediğini olabilir
İlginç CSE veya matris zincir çarpma çalıştırmak için kabul edilen yanıt ek olarak ihtiyaç vardır: Bir sıkıştırma algoritması sıkıştırdığı şeyin boyutunu küçültmeyi amaçlamaktadır ve eğer bunu yapabilmesinin tek yolu ikame olması durumunda, onu izleyebilir ve algoritmanız için gerekli alt bileşenleri elde edebilirsiniz. Bu küçük girdiler için güzel sonuçlar vermeyebilir.
Bu tür bir algoritmanın seçiminde, işlemlerin hangi alt kümelerinin değişmeli olduğu önemli bir husustur. Açgözlü olmadığı sorusu vardır
input: [some product of matrices to compute]
given that multiplying two NxN matrices is O(N^2.376)
given we can visualize the product as follows:
[[AxB][BxC][CxD][DxE]...]
we must for example perform O(max(A,B,C)^2.376) or so operations in order to combine
[AxB][BxC] -> [AxC]
The max(...) is an estimate based on how fast it is to multiply two square matrices;
a better estimate of cost(A,B,C) for multiplying an AxB * BxC matrix can be gotten
from actually looking at the algorithm, or running benchmarks if you don't know the
algorithm used.
However note that multiplying the same matrix with itself, i.e. calculating
a power, can be much more efficient, and we also need to take that into account.
At worst, it takes log_2(power) multiplies each of O(N^2.376), but this could be
made more efficient by diagonalizing the matrix first.
: biz böyle önbelleğe alma gibi efektleri göz ardı edersek,
Biz de optimal çözüm tanımlayabilirsiniz: [değiştir OP hiçbir işlem onun/onu durumda değişmeli diyor] Yaklaşım mümkün değildir: Her adımda tekrarlayan alt dizileri sıkıştırmanız gerekip gerekmediği. Bu durum söz konusu olmayabilir, örn.
aaaaabaab
compressing 'aa' results in ccabcb and compressing 'aab' is now impossible
Ancak biz sıkıştırarak alt dizeleri tüm siparişler denerseniz, muhtemelen çok sık bu sorunla yayınlanmaz, bu bir his var.
Böylece (maliyetler) istediğini yazılı olan ve sorunları, biz bunu zaten yapabilir bir kaba kuvvet algoritması var ve bu matrisin çok az sayıda aday olacak muhtemelen kabul:
# pseudocode
def compress(problem, substring)
x = new Problem(problem)
x.string.replaceall(substring, newsymbol)
x.subcomputations += Subcomputation(newsymbol=substring)
def bestCompression(problem)
candidateCompressions = [compress(problem,substring) for each substring in problem.string]
# etc., recursively return problem with minimum cost
# dynamic programming may help make this more efficient, but one must watch
# out for the note above, how it may be hard to be greedy
Not: Asgeir'in bir başka cevabına göre, bu Matris Zinciri Çarpımı optimizasyon problemi olarak bilinir. Nick Fortescue, daha genel olarak http://en.wikipedia.org/wiki/Common_subexpression_elimination olarak da bilinir - bu nedenle literatürden herhangi bir jenerik CSE veya Matrix-Chain-Çarpma algoritması/kitaplığı bulabilir ve fişi daha önce belirtmiş olduğum maliyet siparişleri büyüklüğünde (siz hangi adayı kullanacağınıza karar vermelisiniz. Yukarıdaki hesaplamaların maliyetinin (çarpma, üs alma, vb.), Son teknoloji ürünü algoritmalar ile verimli bir şekilde yapıldığını varsaydığını unutmayın. Bu durumda değilse, üslerin operasyonların gerçekleştirilme şekline uygun uygun değerlerle değiştirin.
Kısa soru (n log n) - Sadece (mutiplication kullanmakta olduğunuz a * b durumda = b * a) veya * keyfi bir işlem olup, ilgilendiğiniz alt dizelerdir? –
, operatörler aslında matris çarpımlarıdır –
Bunları değişmez yapan yapar. Ama yine de ilişkisel veya bu soru mantıklı olmaz. – phkahler