Hàng ưu tiên cho các ưu tiên được đặt hàng một phần với infima


16

Tôi có một số đối tượng ưu tiên là loại ghép và chỉ được đặt hàng một phần . Tôi cần chọn các đối tượng theo thứ tự ưu tiên này (tức là mang lại mục tối thiểu mỗi lần). Nhưng thay vì tự ý hoàn thành đơn hàng, tôi thích nếu hàng đợi ổn định theo nghĩa là nếu có nhiều hơn một yếu tố tối thiểu, thì nó sẽ trả về cái cũ nhất trước.

Có cấu trúc dữ liệu heap nào sẽ hoạt động với thứ tự một phần không? Hoặc một sửa đổi của hàng đợi ưu tiên thường xuyên để làm việc với nó? Lựa chọn phổ biến cho thuật toán tôi cần là nhị phân đơn giản hoặc heap 4-ary, nhưng điều đó không hoạt động với thứ tự một phần.

Các giá trị ưu tiên hỗ trợ:

  1. Đặt hàng một phần bằng cách sử dụng thao tác . Đó là thứ tự một phần, vì vậy có thể một \ precurlyeq b là sai và b \ precurlyeq a cũng sai. Tôi viết một \ không \ lesseqgtr b trong trường hợp đó.b một một ̸ babbaa⋚̸b
  2. Tìm infima (glb) và suprema (mỡ). inf(xi)y tối đa ysao cho yxi . Việc tính giá trị vô hạn của n giá trị sẽ mất thời gian O(n) . Vô hạn (và tối cao) của mỗi bộ tồn tại.
  3. Một phần mở rộng tuyến tính cho thứ tự một phần có thể được xác định. Sử dụng nó cho hàng đợi ưu tiên là cách dễ dàng vì thuật toán thực hiện theo cách đó. Nhưng thứ tự ảnh hưởng đến hiệu suất và thứ tự chèn có vẻ như là tốt nhất để tránh các trường hợp xấu nhất.

Ngoài ra, thuật toán mà tôi muốn sử dụng này cần phải biết tối đa tất cả các ưu tiên trong hàng đợi.

Các ưu tiên có một số ý nghĩa trong thế giới thực, nhưng có thể thay đổi, do đó dường như không thể dựa vào các thuộc tính khác mà chúng có thể có.


Lưu ý: đống nhị phân không hoạt động với thứ tự một phần. Giả sử một đống nhị phân với a , bc , trong đó aca⋚̸ba⋚̸c . Chúng được định vị theo thứ tự đó, vì vậy

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

bây giờ d được chèn vào. Vị trí miễn phí tiếp theo là 3, con trái của b , vì vậy chúng tôi nhận được

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

Nếu (ngụ ý từ tính chuyển đổi, nhưng không nói gì về và ) và , thì không bị tráo đổi với , vì nó không ít hơn. Nhưng nó thực sự ít hơn , nhưng nó không được so sánh với nó, vì vậy bây giờ bất biến heap chính không giữ được; hàng đầu không phải là tối thiểu.d c d b d ̸ b d b mộtdadcdbd⋚̸bdba

Tôi nghi ngờ một rừng đống có phần nào đó theo kiểu nhị phân có thể được tạo ra để hoạt động. Về cơ bản, điều quan trọng là luôn luôn so sánh các giá trị mới với root và chỉ liên kết các yếu tố so sánh với nhau. Nó sẽ làm cho các cây trong rừng có kích thước ngẫu nhiên và do đó làm cho độ phức tạp phụ thuộc vào số lượng các bộ không thể so sánh được trong đống. Tôi hơi nghi ngờ sự phức tạp không thể khắc phục được (chúng ta phải tiếp tục so sánh cho đến khi chúng ta đạt được một yếu tố tương đương) Tôi có thể đã bỏ lỡ điều gì đó, vì vậy tôi bỏ ngỏ điều này.


Lưu ý: Thứ tự là một phần và trong khi có nhiều cách để xác định tiện ích mở rộng tuyến tính cho nó, việc thêm dấu thời gian và sử dụng nó làm tiêu chí phụ không phải là một trong số đó. Giả sử chúng ta đã gán dấu thời gian cho mỗi và xác định thứ tự là iff hoặc ( và . Sau đó, giả sử chúng ta có , , riêng biệt , sao cho và . Sau đó vàmột ' một ' b một b b một t ( một ) t ( b ) một b c t ( một ) t ( b ) t ( c )t(a)aababbat(a)t(b)abct(a)t(b)t(c)một ' b b ' c c ' mộtcaabbc , nhưng , vì vậy mối quan hệ này không và do đó hoàn toàn không phải là một trật tự. Kiểu mở rộng này chỉ hoạt động cho các thứ tự yếu, nhưng không phải là một phần.ca


Chỉnh sửa: Tôi nhận ra rằng không chỉ là tối ưu của bất kỳ tập hợp nào được xác định, mà tôi thực sự cần phải có khả năng nhận được các yếu tố hiện tại trong hàng đợi một cách hiệu quả. Vì vậy, bây giờ tôi đang suy nghĩ xem việc thêm các nút đặc biệt có chứa infima của cây con vào một số cấu trúc heap chung có giúp ích gì không.


Bạn đã xem xét một hàng đợi ưu tiên được lập chỉ mục?

@hulkmeister: Bạn có thể giải thích làm thế nào để hàng đợi được lập chỉ mục làm cho nó hoạt động với thứ tự một phần (không, heap nhị phân đơn giản không hoạt động với thứ tự một phần)?

1
Tôi nghĩ rằng khi hai mục không thể so sánh được, bạn có thể sử dụng chỉ mục để theo dõi thứ tự chèn. Vì vậy, hãy soạn mức độ ưu tiên với chỉ mục và bạn có các khóa duy nhất có thể so sánh được ngay cả khi mức độ ưu tiên không có. Nếu điều này nghe giống như những gì bạn muốn, tôi có thể đưa nó vào một câu trả lời hoàn chỉnh.

1
@hulkmeister: Chà, vấn đề còn sâu sắc hơn thế nhiều. Khi một mục mới được chèn, hàng đợi ưu tiên thường so sánh nó với một số phần tử. Nhưng nếu chúng không thể so sánh được, đơn giản là nó không biết chèn nó vào đâu. Và định hướng với chỉ mục sẽ không hoạt động, bởi vì chỉ mục thay đổi và bởi vì có lẽ nó sẽ không cho tổng thứ tự phù hợp với mức độ ưu tiên.

Bạn có thể cho một số ví dụ về loại hợp chất này, và khi nó là không thể so sánh được? Có thể xem xét các giá trị 'không thể so sánh' này bằng nhau không? Nếu vậy, bạn có thể lưu trữ chúng trong cùng một nút theo thứ tự chèn.

Câu trả lời:


3

Mặc dù vấn đề chính xác được đặt ra trong câu hỏi ban đầu có vẻ khó khăn (và tôi sẽ quan tâm đến một giải pháp cho vấn đề đó, đặc biệt là phần tìm kiếm cực hạn). Tôi chỉ muốn lưu ý rằng nếu tập hợp được đặt hàng một phần thực sự bao gồm các vectơ sử dụng một đơn đặt hàng sản phẩm và nếu nó đủ để đảm bảo rằng hàng đợi ưu tiên trả về các giá trị theo thứ tự "tương thích" với thứ tự từng phần ( nghĩa là, các phần tử nhỏ hơn luôn được trả về trước các phần tử lớn hơn), sau đó có một cách khá dễ dàng để làm điều đó.

Ý tưởng về cơ bản là tìm một thứ tự tôpô của bộ được đặt một phần. Đó là, tổng số đơn hàng ' ' sao cho . Đối với các vectơ sử dụng một đơn đặt hàng sản phẩm, điều này khá dễ dàng: chỉ cần sử dụng một thứ tự từ điển ' ', trong đó "thành phần" đầu tiên là tổng của tất cả các thành phần được sử dụng cho đơn hàng sản phẩm (phần còn lại của các thành phần về cơ bản là tùy ý, vì vậy bạn cũng có thể dính vào một trật tự yếu). Sau đó, chúng ta có thể thấy rằng và abTS a < babaTbSa = b

a<bi(aibi) and i(ai<bi)(iai)<(ibi)aSb
ab
a=bi(ai=bi)(iai)=(ibi)aSb,
và do đó đó . Do đó, chúng ta có thể sử dụng đơn hàng này với hàng đợi ưu tiên và chắc chắn rằng các phần tử nhỏ hơn (theo thứ tự sản phẩm) sẽ luôn được trích xuất trước các phần tử lớn hơn.abaSb

Có nhiều lựa chọn hơn. Sử dụng một trong các thành phần, tối thiểu, tối đa, bất kỳ kết hợp tuyến tính nào với các hệ số không âm ít nhất. Lựa chọn của phần mở rộng ảnh hưởng đến việc thuật toán lớp phủ sẽ nhanh như thế nào.
Jan Hudec

2

Có gì sai với việc đặt hàng một phần của bạn hoàn thành?

Nhưng thay vì tự ý hoàn thành đơn hàng, tôi thích nếu hàng đợi ổn định theo nghĩa là nếu có nhiều hơn một yếu tố tối thiểu, thì nó sẽ trả về cái cũ nhất trước.

Nếu bạn thích 'cũ nhất trước', thì đơn hàng của bạn đã hoàn tất một cách hiệu quả; Các mặt hàng 'không thể so sánh' có thể so sánh theo độ tuổi.

Thêm dấu thời gian (hoặc bất kỳ số nguyên tăng trưởng đơn điệu nào khác) vào mỗi mục và sử dụng nó nếu không thể so sánh 'thực'.


3
Điều đó sẽ thật tuyệt nếu nó có thể được thực hiện một phần mở rộng tuyến tính của thứ tự từng phần. Nhưng nó không phải là. Chúng ta có 3 giá trị riêng biệt, được chèn theo thứ tự a , b , c , sao cho c ≤ ab không thể so sánh được với một trong hai. Phần mở rộng với dấu thời gian điền vào 'bb ≤' c , do đó, từ độ chuyển đổi bây giờ a phải nhỏ hơn c , nhưng điều đó mâu thuẫn với thứ tự thực tế.

Có lẽ bạn nhầm lẫn nó với thứ tự yếu. Theo thứ tự yếu, các phần tử không thể so sánh tạo thành các lớp tương đương, vì vậy bạn có thể thêm các tiêu chí bổ sung tùy ý. Để đặt hàng một phần bạn không thể.

1

EDIT: đây có vẻ là một vấn đề thú vị, và tôi đã có một nghiên cứu nhỏ về nó. Tôi đề nghị bạn đọc như sau:

  1. Darell Raymond. Cơ sở dữ liệu một phần, Luận án Tiến sĩ, Đại học Waterloo.

Tôi đề nghị bạn đọc bài viết này: Daskalakis, Constantinos, et al. "Sắp xếp và lựa chọn trong posets." Tạp chí SIAM về máy tính 40.3 (2011): 597-622.

Các tác giả trình bày ở đây một cấu trúc dữ liệu được gọi là ChainMerge chấp nhận một poset và một chuỗi phân tách của poset thành các chuỗi . Kích thước của cấu trúc dữ liệu là . Các tác giả trình bày một thuật toán để tìm các minimas chạy trong trong đó là giới hạn trên của chiều rộng của poset. .. Tôi nghĩ có lẽ điều này là thú vị.O ( n q ) O ( w n ) wqO(nq)O(wn)w

Lưu ý: Tôi đã xóa một câu trả lời ngây thơ trước đó. Hãy nhấp vào chỉnh sửa để xem nó.


0

Việc sử dụng thuật ngữ của tôi có thể không chính xác. Vui lòng chỉnh sửa câu trả lời của tôi trực tiếp để khắc phục bất kỳ vấn đề bạn tìm thấy.


Đầu tiên, các bộ không thể so sánh lẫn nhau cần được phát hiện từ các đầu vào.

Ví dụ: có thể có 5 đối tượng a, b, c, d, e, nhưng thứ tự một phần của chúng tạo thành hai biểu đồ bị ngắt kết nối:

  • a ≤ b ≤ c
  • d ≤ e
  • nhưng bất kỳ {a, b, c}là không thể so sánh với bất kỳ {d, e}.

Các bộ không thể so sánh lẫn nhau này cần được phát hiện trước, trước khi các đối tượng có thể được lưu trữ vào một cấu trúc dữ liệu thích hợp. Điều này có thể được thực hiện với thuật toán tìm Union


Để có hiệu quả, việc chèn một đối tượng mới cần có một cách hiệu quả để tìm "danh sách các đối tượng hiện có có thể so sánh với đối tượng mới này".


Bây giờ, trong mỗi tập hợp con (tương ứng {a, b, c}{d, e}), cực tiểu phải được xác định rõ. (Đối với mỗi tập hợp con có thể có một hoặc nhiều cực tiểu, do thứ tự một phần.)

Tôi thấy đây là một biểu đồ chu kỳ có hướng . Cố gắng để phù hợp với nó thành một đống có vẻ thảm họa.


Để trích xuất cực tiểu từ cấu trúc dữ liệu tổng hợp này, bước tiếp theo là lấy danh sách tất cả các cực tiểu từ tất cả các tập hợp con, chọn một với dấu thời gian sớm nhất và xóa và trả về đối tượng này.


Thật không may, tôi không tìm thấy cách hiệu quả để tìm danh sách các đối tượng so sánh.

Bộ được đặt hàng một phần thực sự có thể được xem như biểu đồ chu kỳ có hướng. Nhưng một bảng được đưa ra bởi bảng kề (hàm, thực tế) chứ không phải là danh sách kề. Tìm cực tiểu của poset được đưa ra bởi danh sách kề là dễ dàng, nhưng đối với bảng kề là một vấn đề.

Minima cũng được xác định rõ trong bộ gốc. Tôi không thấy cách tìm các thành phần được kết nối có thể giúp ích, vì chúng không phải là biểu đồ hoàn chỉnh.

1
Bạn dường như cho rằng sơ đồ Hasse là một rừng cây đơn nguyên (biểu đồ đường đi tương đương), nhưng câu hỏi đã nói rằng đó là một đơn đặt hàng sản phẩm, vì vậy một mạng đa chiều.
Peter Taylor

0

Một dự án tôi đang thực hiện liên quan đến một vấn đề tương tự (tình cờ tôi cũng đang sử dụng thứ tự một phần của vectơ). Chúng tôi đã có một thuật toán thời gian bậc hai để sắp xếp một danh sách được sắp xếp ngẫu nhiên và tôi đã phát triển một thuật toán chèn bằng cách quan sát hành vi của nó khi chỉ có một đối tượng không theo thứ tự. Chúng tôi không biết liệu đây có phải là triển khai nhanh nhất có thể hay không.

Đây là một số mã giả.

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

Hành vi heap thông thường là nối thêm giá trị mới vào mặt sau, sau đó sàng lọc trong khi nó so sánh lớn hơn cha mẹ của nó.

Nếu bạn viết một phép so sánh trả về giống nhau cho cha mẹ và con không phải là trường hợp có thể so sánh vì đối với cha mẹ lớn hơn con , thì việc chọn lọc vẫn nên chấm dứt ở đúng điểm.

Điều đó có được tính là một đơn đặt hàng đủ ổn định cho mục đích của bạn không?


Để làm rõ, lấy ví dụ từ nhận xét của bạn: a> bc không thể so sánh với a hoặc b :

  • a rồi b rồi c => a, b, c ... đây là thứ tự heap rồi, và không có gì chuyển động trong sàng lọc
  • b, a, c => a, b, c ... a được rót đến đúng vị trí của nó và một lần nữa chúng ta theo đúng thứ tự heap
  • a, c, b => a, c, b ... b không thể sàng lọc vì nó không thể so sánh với c, nhưng điều này khiến chúng theo thứ tự FIFO như bạn đã hỏi
  • c, b, a => c, a, b ... a và b theo thứ tự tương đối chính xác, nhưng không thể vượt lên trước c vì không thể so sánh với nó

vì vậy, kết quả phụ thuộc vào thứ tự chèn - điều này có vẻ khớp với những gì bạn yêu cầu, nhưng tôi không chắc liệu đó có thực sự là những gì bạn muốn hay không. Nếu không, bạn có thể hiển thị kết quả mà bạn muốn thấy không?


OK, do đó, từ nhận xét của bạn (và chỉnh sửa câu hỏi của bạn), bạn muốn các yếu tố "có thể so sánh" để nhảy vọt các yếu tố "không thể so sánh" và tìm vị trí chính xác theo thứ tự, nếu có. Tôi hỏi về điều này bởi vì tôi không chắc làm thế nào để giải thích

nếu một số phần tử không thể so sánh được, nó sẽ trả về chúng theo thứ tự chúng được chèn vào

(d và b là cặp đôi không thể so sánh được trong bản chỉnh sửa của bạn, nhưng bạn không muốn chúng theo thứ tự chúng được chèn).

Câu hỏi tiếp theo của tôi sẽ là về mối quan hệ giữa các yếu tố "có thể so sánh" và "không thể so sánh", nhưng tôi thấy bạn đã tiết lộ rằng bây giờ chúng là các vectơ theo thứ tự sản phẩm (không rõ liệu một số yếu tố có được ghép đôi không- không thể so sánh với mọi thứ , như NaN, hoặc những gì).

Vì vậy, nếu tôi lấy ví dụ mới của bạn và gán các giá trị vectơ, có đúng không, đây là một ví dụ trong đó b không thể so sánh với bất kỳ thứ gì khác:

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

và nó nên sắp xếp theo thứ này:

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

?


Tôi đã đề cập rõ ràng trong câu hỏi rằng nó sẽ không hoạt động, bởi vì tôi nghĩ rằng tôi có một ví dụ ngược lại, nhưng tôi không chắc chắn với nó bây giờ. Bạn có thể chứng minh rằng hàng đợi như vậy sẽ là âm thanh (để xóa, chèn và cập nhật quá)? Và hãy nhớ rằng, có thể là ≤ b , nhưng c không thể so sánh được (và do đó sẽ so sánh "bằng" với quy tắc trên) với một trong hai quy tắc này.

Chà, đó chưa phải là bằng chứng. Đừng quan tâm đến thứ tự và chứng minh rằng heap đó luôn có phần tử tối thiểu ở trên cùng (lưu ý: (thêm) quy ước chung và nhu cầu thực tế của thuật toán là tối thiểu ở trên cùng, vì vậy nếu a> b , b xuất hiện trước ).

Trên thực tế tôi nghi ngờ có ví dụ phản tác dụng. Giả sử a , bc nằm trong đống, a ≤ ba ≤ c , a là đỉnh, b là con trái, c là con phải. Bây giờ d đến d ≤ c và không thể so sánh với ab . Nó được chèn vào như con của b , không ít hơn và vẫn ở đó. Bây giờ đến e đó là c ≤ e (do đó cũng là a e ) và không thể so sánh với b . Vì vậy, e đi vào đúng như con của bvà ở lại. Bây giờ giải nén một (OK, a là tối thiểu), e bị tráo đổi ở vị trí của nó và rây xuống. Nó không thể so sánh được với b , nhưng nhỏ hơn c , nên hoán đổi với c . Bây giờ giải nén c , SAI , d ≤ c .

Nếu bạn tìm thấy một lỗi trong nhận xét trước đó (cần phải có một dạng bất bình đẳng phải giữ vì tính chuyển đổi và tôi đã bỏ qua nó), bạn vẫn có cơ hội. Nếu không nó sẽ không hoạt động.

1
Ok, ví dụ thậm chí đơn giản hơn. Giả sử a , bc nằm trong heap, a ≤ c , b không thể so sánh được với một trong hai. a là đỉnh, b là con trái, c là con phải. d đi vào sao cho d ≤ a (do đó d ≤ c ) và không thể so sánh được với b . Khe miễn phí tiếp theo là con trái của bd là không thể so sánh được, vì vậy nó vẫn ở đó. Bây giờ giải nén a , SAI , d ≤ a . Lưu ý rằng liệu a ≤ choặc không quan trọng, tình huống là như nhau nếu chúng không thể so sánh được.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.