2008-11-15 16 views
8

ile bir aralığın en az kapsama bulma {( i a, b i)} i olan birlik tüm (I bir aralık alt aralık (a, b) ve bir dizi olduğunu varsayalım a, b). Hala (a, b) kapsamındaki bu alt-kaynakların minimal-asalet alt kümesini seçmenin etkili bir yolu var mıdır?alt aralıkları

+0

En az sayıda alt iş parçacığı veya en az sayıda öğeye (ve dolayısıyla en az çift kopyaya sahip) sahip alt veri kümesi kümesini mi arıyorsunuz? –

cevap

12

Kanıt: S: Ssetini aşağıdakileri içeren tüm alt kaynaklardan kabul edin. Açıkçası, bunlardan biri en uygun çözüme ait olmalı. Biz S den ( maksimum b maksimum) bir alt aralık ile değiştirin kimin sağ uç b maksimum S bir (ulaşır sağa en uzak), geri kalan ortaya aralığı içinde maksimum (bir b max, b) en uygun çözümden kalan aralığın bir alt kümesi olacaktır, bu yüzden optimal çözümden analog açılmamış aralığa göre daha fazla altinterle kaplanamaz.Bu nedenle, ( max, en max) ve kalan aralık için optimal çözüm (b maks, b) 'den yapılan bir çözüm de optimal olacaktır.

Bu yüzden, en sağa (ve önceki aralığın sonunu kaplayan) aralıktan bir ve iteratif olarak devam edin, b tuşuna basana kadar tekrarlayın. Aralıkları aralıklı bir aralık ağacında saklarsanız, sonraki aralığı seçmek log (n) 'de yapılabilir.

+0

Aşağıdakileri detaylandırır mısınız: "kalan kapanmamış aralık (bmax, b) en uygun çözümden kalan aralığın bir alt kümesi olacaktır"? – jfs

+0

Bu çözümün işe yaradığını düşünüyorum ve benimkinden daha iyi. – Artelius

+0

@JFS: En uygun çözümün, (a, bi) ve yaprakları (bi, b) kaplayan bir aralık (ai, bi) ile başladığını varsayalım. (Amax, bmax) tanımından, bmax> = bi, yani (bmax, b), (bi, b) 'nin bir alt kümesidir (altbölgesi). –

1

Dinamik programlama gibi görünüyor.

//works backwards from the end 
int minCard(int current, int must_end_after) 
{ 
    if (current < 0) 
     if (must_end_after == 0) 
      return 0; //no more intervals needed 
     else 
      return infinity; //doesn't cover (a,b) 

    if (intervals[current].end < must_end_after) 
     return infinity; //doesn't cover (a,b) 

    return min(1 + minCard(current - 1, intervals[current].start), 
       minCard(current - 1, must_end_after)); 
      //include current interval or not? 
} 

Ama aynı zamanda önbelleğe (memoisation) içermelidir:

İşte (aralıkları zaman biten göre sıralı listede olduğunu varsayıyorum) algoritmasının bir açıklama verilmiştir.

+0

'minCard()' asgari bir asallık elde etmek için tasarlanmıştır, ancak soru asgari düzeyde asaleten bir alt set ister. – jfs

+0

Bu algoritmanın bir uzantısı olacak ve bu da en uygun değeri oluşturmak için hangi alt kümenin kullanıldığını takip ediyor. – Artelius

+0

@Artelius Algoritmanızın karmaşıklığı nedir? –

-2

Yani, alt-tabakalar hala (a, b) tüm noktalarda tamamen kapalı kalacak şekilde üst üste binecek şekilde mi?

Belki de alt röleleri kendilerinin geldikleri yerle ilişkili temel bloklara ayırmak, böylece altbölümün kapsadığı diğer bölgeler için her bir temel blok aralığı muhasebesi için seçenekleri listeleyebilirsiniz. Ardından, her bir alt alt veri kaynağına dayalı bir arama kullanabilir ve en azından hiç boşluk kalmadığından emin olun.
O halde, daha verimli arama yapmalıyız. Bu daha zor olurdu.

Tamamen başka bir küçük sayı kümesi tarafından kapsanan aralıkların toplanmasını kaldırabilir ve önişlemden sonra sorunu çözebilir.
En azından bir buçuk için minimal olmaz mıydı? Emin değilim.

Bir günlüğe bir link bulundu, ancak okuyamadı. :(

Bu hitting set sorun olacağını ve genel olarak NP_hard edilecek.
this okumak ya ama sorunun karşısındaki tür gibi görünüyor alınamadı.
bunu okunamadı ama bölme aralıkları yukarı bahseder başka link.
Here GeometricOptimization Sorunları randomize Algoritmalar kullanılabilir bir referanstır. Bu pdf
Sayfa 35 açgözlü bir algoritma vardır.
Sayfa Karp (1972) 11 isabet-set bahseder ve çok çağırılır.
Google result. Araştırmak eğlenceliydi ama şimdi gitmeliyim. A veya b ile başlayan açgözlü bir algoritma her zaman en uygun çözümü verir.

0

Göz önünde bulundurulması gereken iki durum vardır: Durum 1: Bir aralığın bitiş zamanından sonra üst üste binme aralıkları yoktur. Bu durumda, en küçük başlangıç ​​zamanı ve en uzun son işlem süresi ile bir sonraki aralığı seçin. (amin, bmax). Durum 2: Baktığınız son aralıkla 1 veya daha fazla üst üste binme aralığı vardır. Bu durumda, başlangıç ​​zamanı önemli değil çünkü bunu zaten biliyorsunuz. Bu yüzden bitiş zamanı için optimize edin. (a, bmax).

Örnek 1, her zaman ilk aralığı optimum ayardaki ilk aralık olarak seçer (kanıt, @RafalDowgrid'in sağladığı ile aynıdır).

İlgili konular