İnfima ile kısmen sıralı öncelikler için öncelik sırası


16

Bileşik türü ve sadece kısmen sipariş öncelikli bazı nesneler var . Bu öncelik sırasına göre nesneleri seçmek gerekir (yani her zaman en az öğe verim ). Ancak keyfi olarak siparişi tamamlamak yerine, sıranın birden fazla minimal öğe varsa, ilk önce en eski olanı döndürmesi anlamında kararlı olmasını tercih ederim.

Kısmi sıralama ile çalışacak herhangi bir yığın veri yapısı var mı? Veya onunla çalışmak için düzenli öncelik sırasının değiştirilmesi? Ihtiyacım olan algoritma için ortak seçim basit ikili veya 4-ary yığın, ama bu kısmi sipariş ile çalışmaz.

Öncelik değerleri şunları destekler:

  1. işlemi kullanılarak kısmi sipariş verme . Kısmi sıralama, bu nedenle yanlış ve da yanlış olabilir. Yazdığım bu durumda.a b b a a ̸ bbirbbbirbir⋚̸b
  2. Infima (glb) ve suprema (lub) bulma . maksimumdur y şekilde Y \ preccurlyeq x_i . En fazla n değerinin hesaplanması O (n) zaman alır. Her setten en az (ve en yüksek) var.inf(xben)y x i n O ( n )yyxbennÖ(n)
  3. Kısmi sıralama için doğrusal bir uzantı tanımlanabilir. Öncelik sırası için kullanmak, algoritmanın bu şekilde çalıştığı için kolay çıkış yoludur. Ancak düzen performansı etkiler ve ekleme sırası en kötü durumlardan kaçınmak için en iyi gibi görünmektedir.

Ayrıca bu kullanmak istediğiniz algoritma kuyruktaki tüm öncelikleri en iyi bilmek gerekiyor.

Önceliklerin bazı gerçek dünya anlamları vardır, ancak değişime tabidirler, bu nedenle sahip olabilecekleri diğer özelliklere güvenmek uygun görünmemektedir.


Not: İkili yığınlar kısmi sıralama ile çalışmaz. bir , b ve c ile bir ikili yığın varsayalım c; burada birc ve bir⋚̸b ve bir⋚̸c . Bu sırayla konumlandırıldılar, yani

     a (0)
   /   \
 b (1)   c (2)

şimdi d eklenir. Bir sonraki boş pozisyon 3, b'nin sol çocuğu b, bu yüzden

        a (0)
      /   \
    b (1)   c (2)
  /
d (3)

Eğer (ima hangi geçişlilik gelen, ancak hakkında hiçbir şey söylemez ve ) ve , daha sonra ile takas almaz değil daha az olduğu için,. Ama aslında daha az , şimdi ana yığın değişmez tutmaz, ama onunla kıyaslandığında değil; üst minimal değildir.d c d b d ̸ b d b adbirdcdbd⋚̸bdbbir

Ben binom yığın tarzında bir yığın yığın ormanı işe yarayabileceğinden şüpheleniyorum. Temel olarak yeni değerleri her zaman kök ile karşılaştırmak ve sadece karşılaştırılabilir öğeleri birbirine bağlamak önemlidir. Ormandaki ağaçları rastgele boyutlandırır ve böylece karmaşıklığı yığındaki karşılıklı olarak karşılaştırılamayan kümelerin sayısına bağlı hale getirir. Bir şekilde karmaşıklığın giderilemeyeceğinden şüpheleniyorum (karşılaştırılabilir bir öğeye çarpana kadar karşılaştırmaya devam etmeliyiz) Bir şeyi kaçırmış olabilirim, bu yüzden bunu açık bırakıyorum.


Not: Sıralama kısadır ve bunun için doğrusal bir uzantı tanımlamanın yolları olsa da, zaman damgası eklemek ve ikincil ölçüt olarak kullanmak bunlardan biri değildir . Biz damgası tahsis varsayalım her biri için ve sipariş tanımlandığı olarak IFF ya da ( ve . Daha sonra farklı olduğunu varsayalım , , , bu şekilde ve . Daha sonra vea a b a b b a t ( a ) t ( b ) a bt(bir)bir'bir'bbirbbbirt(a)t(b)abct(a)t(b)t(c)caabbc , ancak , bu nedenle ilişki geçişli değildir ve bu nedenle bir sipariş değildir. Bu tür genişletme sadece zayıf siparişler için çalışır, ancak kısmi siparişler için işe yaramaz.cbir


Düzenleme: Ben sadece tanımlanan herhangi bir kümenin infimum olduğunu fark ettim, ama aslında şu anda verimli bir şekilde kuyrukta elemanların infimum almak gerekir. Bu yüzden şimdi, bazı ortak yığın yapılarına alt ağaç infima içeren özel düğümler eklemenin yardımcı olup olmayacağını düşünüyoruz.


Dizine Alınmış Bir Öncelik Sırası'nı düşündünüz mü?

@hulkmeister: Kuyruğu dizine eklemenin kısmi sıralama ile nasıl çalıştığını açıklayabilir misiniz (hayır, düz ikili yığın kısmi sıralama ile çalışmaz)?

1
Benim düşüncem, iki öğe karşılaştırılamaz olduğunda, ekleme sırasını izlemek için dizini kullanabilirsiniz. Bu nedenle önceliği dizinle oluşturun ve öncelik olmadığında bile karşılaştırılabilir benzersiz anahtarlarınız vardır. Bu istediğiniz gibi görünüyorsa, tam bir cevaba koyabilirim.

1
@hulkmeister: Sorun bundan daha derin. Yeni bir öğe eklendiğinde, öncelik kuyruğu normalde onu bir öğeyle karşılaştırır. Ancak karşılaştırılamazlarsa, nereye yerleştireceklerini bilmiyorlar. Ve endeks ile netleştirme işe yaramaz, çünkü dizin değişir ve muhtemelen zaten öncelik ile tutarlı toplam sipariş vermez.

Bu bileşik tipine ve karşılaştırılamaz olduğunda bir örnek verebilir misiniz? Bu 'kıyaslanamaz' değerleri eşit saymak mümkün mü? Öyleyse, bunları ekleme sırasına göre aynı düğümde saklayabilirsiniz.

Yanıtlar:


3

Her ne kadar orijinal soruda ortaya çıkan sorun zor gibi görünse de (ve bu soruna, özellikle de infima bulma kısmına bir çözümle ilgileneceğim). Sadece kısmi sıralı set gerçekten bir ürün siparişi kullanan vektörlerden oluşuyorsa ve öncelik sırasının değerleri kısmi sıra ile "uyumlu" bir sırayla döndürdüğünü garanti etmek için yeterliyse ( yani, daha küçük öğeler her zaman daha büyük öğelerden önce döndürülür), o zaman bunu yapmanın oldukça kolay bir yolu vardır.

Fikir esasen kısmen sıralı kümenin topolojik bir düzenini bulmaktır. Yani, toplam bir ' ' sırası . Bir ürün siparişi kullanan vektörler için bu oldukça kolaydır: sadece ilk "bileşen", ürün siparişi için kullanılan tüm bileşenlerin toplamıdır (bileşenlerin geri kalanı esasen isteğe bağlıdır), sözlüksel bir sipariş ' ' kullanın , böylece zayıf bir düzene bağlı kalabilirsiniz). Daha sonra ve abTS a < babaTbSa = b

a<bi(aibi) and i(ai<bi)(iai)<(ibi)aSb
a=bi(ai=bi)(iai)=(ibi)aSb,
ve böylece bu . Bu nedenle bu siparişi öncelik kuyruğuyla kullanabilir ve daha küçük öğelerin (ürün siparişinde) her zaman daha büyük öğelerden önce çıkartılacağından emin olabiliriz.abaSb

Daha birçok seçenek var. Bileşenlerden birini kullanarak, minimum, maksimum, negatif olmayan katsayılarla herhangi bir doğrusal kombinasyon. Uzantı seçimi, kaplama algoritmasının ne kadar hızlı olacağını etkiler.
Jan Hudec

2

Kısmi siparişinizi tamamlamanın nesi yanlış?

Ancak, siparişi keyfi olarak tamamlamak yerine, sıranın birden fazla minimal öğe varsa, ilk önce en eski olanı döndürmesi anlamında kararlı olmasını tercih ederim.

'Önce en eskisini' tercih ederseniz, siparişiniz etkili bir şekilde tamamlanır; 'kıyaslanamaz' öğeler yaşa göre karşılaştırılabilir.

Her öğeye bir zaman damgası (veya monoton olarak büyüyen başka bir tam sayı) ekleyin ve 'gerçek' karşılaştırma mümkün değilse kullanın.


3
Kısmi sıralamanın doğrusal bir uzantısı yapılabilseydi bu harika olurdu. Ama değil. A , b , c sırasıyla eklenmiş 3 ayrı değere sahip olalım , öyle ki c ≤ a ve b ikisiyle de karşılaştırılamaz. Damgası Dolgularla uzantısı bir ≤ 'b ve b ≤' c yüzden geçişlilik gelen, şimdi bir daha az olmalıdır c ama çelişir o fiili sipariş.

Belki de zayıf düzen ile karıştırdınız. Zayıf düzende, kıyaslanamayan elemanlar denklik sınıfları oluşturur, böylece keyfi ek kriterler ekleyebilirsiniz. Kısmi sipariş için yapamazsınız.

1

EDIT: Bu ilginç bir sorun gibi görünüyor ve bu konuda biraz araştırma yaptım. Aşağıdakileri okumanızı öneririm:

  1. Darell Raymond. Kısmi sıra veritabanları, Doktora Tezi, Waterloo Üniversitesi.

Bu makaleyi okumanızı tavsiye ederim: Daskalakis, Constantinos, et al. "Sıralama ve seçim posets." SIAM Bilişim Dergisi 40.3 (2011): 597-622.

qÖ(nq)Ö(wn)w

Not: Bir önceki saf cevabı sildim. Görmek için lütfen düzenle üzerine tıklayın.


0

Terminoloji kullanımım yanlış olabilir. Bulduğunuz sorunları çözmek için lütfen cevabımı doğrudan düzenleyin.


İlk olarak, girişlerden karşılıklı olarak karşılaştırılamaz kümelerin tespit edilmesi gerekir.

Örneğin, 5 nesne olabilir a, b, c, d, e, ancak kısmi sıralaması iki bağlantısız grafik oluşturur:

  • a ≤ b ≤ c
  • d ≤ e
  • ancak herhangi biriyle {a, b, c}karşılaştırılamaz {d, e}.

Nesnelerin uygun bir veri yapısında saklanabilmesi için öncelikle karşılıklı olarak karşılaştırılamaz kümelerin saptanması gerekir. Bu bir Union find algoritması ile yapılabilir


Verimlilik için, yeni bir nesnenin eklenmesi, "bu yeni nesne ile karşılaştırılabilir mevcut nesnelerin listesini" bulmanın etkili bir yoluna sahip olmalıdır.


Şimdi, her alt kümede (sırasıyla {a, b, c}ve {d, e}), minima iyi tanımlanmış olmalıdır. (Her alt küme için kısmi sıralamaya bağlı olarak bir veya daha fazla minimum olabilir .)

Bunu yönlendirilmiş asiklik bir grafik olarak görüyorum . Bir yığın içine sığdırmaya çalışmak felaket gibi görünüyor.


Minimayı bu bileşik veri yapısından çıkarmak için bir sonraki adım, tüm alt kümelerden tüm minimaların listesini almak, en erken zaman damgasına sahip olanı seçmek ve bu nesneyi kaldırmak ve geri döndürmektir.


Ne yazık ki karşılaştırılabilir nesnelerin listesini verimli bir şekilde bulmanın yolunu göremiyorum.

Kısmen sıralı set gerçekten yönlendirilmiş asiklik grafik olarak görülebilir. Ancak bitişiklik listesinden ziyade bitişiklik tablosu (aslında işlev) ile verilir. Bitişiklik listesi tarafından verilen poset minimasını bulmak kolaydır, ancak bitişiklik tablosu için bu bir problemdir.

Minima orijinal sette de iyi tanımlanmıştır. Tam bileşenleri olmadığı için, bağlı bileşenleri bulmanın nasıl yardımcı olabileceğini görmüyorum.

1
Hasse diyagramının tek ağaçların (eşdeğer yol grafikleri) bir ormanı olduğunu varsayıyorsunuz, ancak soru bunun bir ürün siparişi olduğunu, yani çok boyutlu bir kafes olduğunu belirtti.
Peter Taylor

0

Üzerinde çalıştığım bir proje de benzer bir problem içeriyor (bu arada vektörlerin kısmi sırasını da kullanıyorum). Rastgele sıralı bir listeyi sıralamak için zaten ikinci dereceden bir zaman algoritmamız vardı ve yalnızca bir nesne arızalı olduğunda davranışını gözlemleyerek bir ekleme algoritması geliştirdim. Bunun mümkün olan en hızlı uygulama olup olmadığını bilmiyoruz.

İşte bazı sahte kod.

class PartialOrderPriorityQueue
   q <- empty list
   method insert (n):
     for i <- 0 to (q.length - 1):
       if q[i] <= n:
         t <- q[i]
         q[i] <- n
         n <- t
     q.append(n)

   method pop():
     return q.remove(0)

-1

Genel yığın davranışı, yeni değeri arkaya eklemek ve daha sonra üst öğesinden daha büyük bir değerle karşılaştırmaktır.

Ebeveyn ve çocuk için aynı döndüren bir karşılaştırma yazarsanız, ebeveyn için çocuktan daha büyük bir durum varsa , yukarı kaydırma yine de doğru noktada sonlandırılmalıdır.

Bu, amaçlarınız için yeterince istikrarlı bir sipariş olarak sayılıyor mu?


Açıklığa kavuşturmak için, yorumunuzdaki örneği alın: a> b ve c , a veya b ile karşılaştırılamaz :

  • a sonra b sonra c => a, b, c ... bu zaten yığın düzenindedir ve hiçbir şey yukarı çıkmaz
  • b, a, c => a, b, c ... a doğru yerine elenir ve yine doğru yığın düzenindeyiz
  • a, c, b => a, c, b ... b elemek mümkün değil çünkü c ile karşılaştırılamaz, ancak bu onları istediğiniz gibi FIFO düzeninde bırakır
  • c, b, a => c, a, b ... a ve b doğru göreceli sıradadır, ancak ikisi de c'nin önüne geçemez, çünkü onunla karşılaştırılamazlar

Bu nedenle, sonuç ekleme sırasına bağlıdır - bu, ne istediğinizle eşleşiyor gibi görünüyor, ancak gerçekten ne istediğinizden emin değilim. Değilse, görmeyi umduğunuz sonucu gösterebilir misiniz?


Tamam, bu yüzden yorumunuzdan (ve sorunuzdaki düzenlemeden), "karşılaştırılabilir" öğelerin "karşılaştırılamaz" olanları atlamak ve varsa siparişin altında doğru yeri bulmak istiyorsunuz. Bunu sordum çünkü nasıl yorumlanacağından emin değildim

bazı öğeler karşılaştırılamazsa, bunları yerleştirildikleri sırayla döndürür

(d ve b Düzenlemenizle içinde ikili kıyaslanamaz, ancak yok onlar sokulmuş sırayla istiyorum).

Bir sonraki sorum "karşılaştırılabilir" ve "karşılaştırılamaz" öğeler arasındaki ilişkiyle ilgili olurdu, ancak şimdi onların ürün düzeninde vektörler olduğunu ortaya çıkardığını görüyorum (bazı öğelerin çift olup olmadığı net değildi- NaN veya ne gibi her şeyle karşılaştırılamaz ).

Yani, yeni örneğinizi alıp vektör değerleri atarsam, b'nin başka hiçbir şeyle karşılaştırılamayacağı bir örnek olması doğru mu?

        a (1,1)
      /      \
    b (0,4)   c (3,3)
  /
d (2,2)

ve buna göre sıralanmalıdır:

        a (1,1)
      /      \
    d (2,2)   c (3,3)
  /
b (0,4)

?


Bu sorunun işe yaramayacağından açıkça bahsetmiştim, çünkü karşı bir örneğim olduğunu düşündüm, ama şimdi bundan pek emin değilim. Bu kuyruğun sağlam olacağını kanıtlayabilir misiniz (silme, ekleme ve güncelleme için)? Ve unutmayın ki a ≤ b , ancak c her ikisiyle de karşılaştırılabilir değildir (ve dolayısıyla "eşit" i yukarıdaki kuralla karşılaştırır).

Bu henüz bir kanıt değil. Henüz sıraya aldırmayın ve böyle bir yığının her zaman üstte en az eleman olduğuna dair kanıt (not: (daha fazla) ortak kural ve algoritmanın gerçek ihtiyacı en üstte minimumdur , bu yüzden a> b , b önce gelir ).

Aslında karşı örnek olduğundan şüpheleniyorum. Varsayalım bir , b ve c yığın, bulunan bir ≤ b ve bir ≤ c , bir üst olduğunu, b , sol çocuk olduğu c doğru çocuktur. Şimdi d , d ≤ c ve a ve b ile kıyaslanamaz hale gelir . Bu çocuğu olarak eklenir b , az ve kalır vardır. Şimdi gelir E olduğu c ≤ e (böylece aynı zamanda bir ≤ e ) ve eşsiz b . Yani e doğru çocuk olarak gider bve kalır. Şimdi bir (Tamam, a minimal), e yerine takas ve elendi. O kıyaslanamaz b , ama daha az c takası böylece ile, c . Şimdi c , WRONG , d ≤ c'yi çıkarın .

Önceki yorumda bir hata bulursanız (bu, şeffaflık nedeniyle tutması gereken bir eşitsizlik formuna sahip olması gerekir ve bunu kaçırdım), yine de bir şansınız olacaktır. Aksi takdirde çalışmaz.

1
Tamam, daha basit bir karşı örnek. A , b ve c'nin yığınta olduğunu varsayalım , a ≤ c , b ikisiyle de karşılaştırılamaz. a üst, b sol çocuk, c sağ çocuk. d , d ≤ a (böylece d ≤ c ) olacak şekilde gelir ve b ile karşılaştırılamaz . Bir sonraki boş yuva, b ve d' nin sol çocuğu karşılaştırılamaz, bu yüzden orada kalır. Şimdi a , YANLIŞ , d ≤ a . Not bu ister bir ≤ cya da önemli değil, eğer kıyaslanamazlarsa durum aynıdır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.