biên tập:
Vì vậy, rõ ràng tôi đã không giải thích điều này tốt, vì vậy hãy để tôi thử lại với các ví dụ. Tôi có một 'ống' có kích thước nhất định với các tín hiệu được truyền qua nó tại các độ lệch đã cho. Các đường ống có thể bị phân mảnh với các tín hiệu ở các độ lệch khác nhau làm cho nó không thể phù hợp với tín hiệu mới. Tôi muốn một thuật toán sẽ cho tôi biết cách sắp xếp các tín hiệu để chống phân mảnh đường ống; nhưng với số lượng tín hiệu tối thiểu thực sự được di chuyển! Vì vậy, ví dụ ..
Giả sử tôi có một ống có kích thước 16. Nó có các tín hiệu sau với các kích thước và độ lệch được mô tả.
offset 0: A (size of 4; fills slots 0-3)
offset 5: C (size of 2, fills slot 5-6)
offset 8: B (size of 4, fills 8-11)
offset 14: D (size 2, fills 14-15)
Pipe: AAAA_CC_BBBB__DD
Trong trường hợp này, tôi có 1 vị trí mở tại offset 4 & 7 và hai vị trí ở phần bù 12-13. Bây giờ hãy nói rằng tôi muốn thêm tín hiệu kích thước 4 vào đường ống này. Không có không gian liên tục cho nó bây giờ, nhưng tôi biết tôi có đủ không gian cho nó nếu tôi chống phân mảnh. Giải pháp 'hiển nhiên' là nhóm tất cả các tín hiệu lại với nhau ở 'đỉnh' như thế này:
offset 0: A (size 4, fills 0-3)
offset 4: B (size 4, fills 4-7)
offset 8: C (size 2, fills 8-9)
offset 10: D (size 2, fills 10-11)
Pipe: AAAABBBBCCDD____
Điều này để lại các khe 12-15 miễn phí cho tín hiệu mới của tôi. Tuy nhiên, để làm điều này tôi đã định vị lại 3 tín hiệu (BD). Đối với mỗi tín hiệu tôi di chuyển, tôi phải gửi các lệnh xuống phần cứng và chờ một khoảng thời gian không hề nhỏ.
Nếu tôi thông minh hơn tôi có thể nhận ra có một sự chấp thuận khác. Tôi có thể định vị lại như thế này:
offset 0: A(size 4, fills 0-3)
offset 8: B(size 4, fills 8-11)
offset 12: C(size 2, fills 12-13)
offset 14: D(size 2, fills 14-15).
Pipe: AAAA____BBBBCCDD
Bây giờ tôi có thể điều chỉnh tín hiệu mới của mình trong các lần bù 4-7; VÀ tôi chỉ phải định vị lại một tín hiệu (B). Do đó tiết kiệm cuộc gọi phần cứng.
Tôi tự hỏi nếu có một thuật toán tốt để phát hiện các chỗ ngồi như thế này; nơi tôi có thể 'lắp' tín hiệu vào đường ống với số lượng tín hiệu tối thiểu được di chuyển. Apta thta đến với tâm trí là một N! thuật toán; về cơ bản là hướng đến "tạo ra mọi phân phối có thể, tính toán số lần di chuyển mà nó dẫn đến". Tôi đang cho một sự chấp thuận nhanh hơn.
Sự chấp thuận không nhất thiết phải hoàn hảo 100%, tôi chủ yếu tìm cách giảm thiểu trường hợp trung bình, miễn là trường hợp xấu nhất không được thực hiện quá khủng khiếp. Tôi biết rằng tôi sẽ không bao giờ có nhiều hơn 255 tín hiệu trên một đường ống nhất định; vì vậy tôi có thể 'thoát khỏi' với N! tệ như âm thanh đó Tôi cũng biết kích thước của mỗi tín hiệu là công suất bằng 2, cũng như kích thước đường ống.
Ngoài ra, có bất kỳ thuật toán sáng chói để đặt các tín hiệu giảm thiểu sự phân mảnh?
Câu hỏi đã được trả lời; xem bên dưới.
Tôi muốn tiết lộ một chút về câu trả lời để giải thích rõ hơn về việc phân mảnh sẽ xảy ra như thế nào đối với bất kỳ ai đọc; bạn thân giải thích nó tôi muốn chỉ ra một cách tiếp cận đơn giản hơn để khái niệm hóa và giải thích phần phân mảnh chi tiết hơn vì đó là câu hỏi ban đầu.
Tôi đang giải thích về sự chấp thuận của mình, đó là một cách tiếp cận hơi khác / đơn giản hơn nhưng vẫn giữ hiệu quả khái niệm 'bạn thân'. Tôi không tính toán trước các khối hoặc dán nhãn cho chúng, đây là quá nhiều nỗ lực để thực hiện và duy trì. Đối với tôi, chi phí CPU để tính toán tín hiệu sẽ đi đâu là khá nhỏ so với việc đặt / xóa tín hiệu thực tế; vì vậy tôi có thể đủ khả năng để mất một lượng CPU nhỏ, tuyến tính bằng cách không tính toán trước để đơn giản hóa logic của mình. Vì vậy, quá trình là:
để chèn:
Tất cả các tín hiệu được giữ trong các ranh giới tín hiệu bằng với kích thước tín hiệu, do đó tín hiệu sẽ bắt đầu ở phần bù trong đó% offestize = 0. Để bù đắp Actuall, chúng tôi đi qua và tìm ra các khoảng thời gian giữ liên kết này. Vì vậy, nếu tín hiệu của tôi là kích thước 4 trên ống kích thước 16, tôi sẽ xem xét các khoảng 0-4, 5-7, 8-11, 12-15.
Đối với mỗi khoảng thời gian kiểm tra nếu tất cả không gian trong khoảng đó là miễn phí. Trong trường hợp đơn giản, chúng ta có một khoảng không có tín hiệu trong đó và chúng ta chỉ đặt tín hiệu ở khoảng đó. Quan trọng, chúng tôi xem xét các khoảng theo thứ tự và đặt tín hiệu của chúng tôi trong khoảng miễn phí đầu tiên , điều này đảm bảo chúng tôi phá vỡ 'khối' nhỏ nhất có thể (sử dụng thuật ngữ bạn bè) khi chúng tôi thêm tín hiệu của mình. Điều này nên tương đương với sự chấp thuận của bạn bè được mô tả bởi im3l96; ngoại trừ không có tiền mã hóa của các khối.
nếu không có khoảng cách nào là hoàn toàn miễn phí, chúng ta phải chống phân mảnh. Đối với điều này, chúng tôi tìm thấy tín hiệu với các khe không được sử dụng nhiều nhất. Nếu các khoảng nhiều lần có cùng số lượng vị trí không được sử dụng, hãy chọn khoảng đầu tiên. Sau đó, chúng tôi tìm thấy tín hiệu lớn nhất trong khoảng này và gọi đệ quy cùng một thuật toán chèn cho tín hiệu nhỏ hơn (ngoại trừ đánh dấu khoảng thời gian chúng tôi đã chọn để chèn tín hiệu đầu tiên là không khả dụng bằng cách nào đó). Điều này di chuyển tín hiệu đến một nơi khác mà nó sẽ phù hợp. Sau đó chúng tôi tìm thấy tín hiệu nhỏ nhất tiếp theo trong khoảng thời gian đã chọn và thực hiện tương tự cho đến khi chúng tôi di chuyển tất cả các tín hiệu. Trường hợp xấu nhất của tín hiệu 2 ^ n-1 di chuyển; Trong đó N là số kích thước tín hiệu tiềm năng <= tín hiệu của chúng tôi (giả sử tín hiệu là bội số của 2 thì N = log2 (signalSize)).
Đây là một ví dụ. * là viết tắt của một vị trí được đánh dấu là không khả dụng khi chúng tôi gọi phương thức này một cách đệ quy (tức là khoảng thời gian mà phương thức gọi muốn đặt tín hiệu của nó và do đó không muốn cuộc gọi đệ quy cố gắng đặt tín hiệu vào)
Đây là một ví dụ đơn giản, đơn giản nhất mà tôi có thể đưa ra mà vẫn thể hiện sự phức tạp đầy đủ. Lưu ý: cấu trúc sau đây sẽ khó tạo, nhưng có thể là kết quả của sự chấp thuận của bạn bè nếu ai đó đã rất cố gắng.
FFFFFFFF__AA_B__EEEE_HGGCC_DII_J
Ai đó truyền tín hiệu Z cỡ 8
chúng tôi chọn bù 8:
defragInsert (z, cỡ 8)
effective structure: FFFFFFFF__AA_B__EEEE_HGGCC_DII_J
placing signal in interval: __AA_B__
defragInput (A, cỡ 2)
effective structure: FFFFFFFF********EEEE_HGGCC_DII_J
place signal in interval (offset 20) _H
defragInput (H, size1)
effective structure: FFFFFFFF********EEEE**GGCC_DII_J
place signal between C & D
return defragInput (H, size1)
effective structure: FFFFFFFF********EEEE__GGCCHDII_J
place H at offset 20 now that it's open
return defragInput (A, size 2)
cấu trúc hiệu quả: FFFFFFFF_ _ _B__EEEEAAGGCCHDII_J di chuyển B ngay bây giờ ...
defragInput (B, size1)
cấu trúc hiệu quả: FFFFFFFF * ** * EEEEAAGGCCHDII_J đặt B giữa I & J
trả về defragInput (B, size1)
cấu trúc hiệu quả: FFFFFFFF_ __ _EEEEAAGGCCHDIIBJ thêm B
return defragInsert (z, size 8)
fianl structure: FFFFFFFFzzzzzzzzEEEEAAGGCCHDIIBJ