Giả sử tôi có một danh sách các số nguyên, trong đó mỗi phần tử là một số từ 1 đến 20. (Đó không phải là những gì tôi đang cố sắp xếp.)Loại phân loại này là gì?
Bây giờ, tôi có một loạt các "hoạt động", trong đó mỗi hoạt động:
- Loại bỏ nhất định (biết) số điện thoại từ danh sách
- vàThêm nhất định khác số (được gọi) vào danh sách
- và là không có khả năng xử lý danh sách nếu nó có chứa một số số (biết) vào đầu hoạt động - gọi những Ngăn chặn
Edit: Có thể có không hoặc nhiều số trong mỗi Thêm , Xóa và Ngăn chặn cho mỗi thao tác và mỗi số có thể xuất hiện 0 hoặc nhiều lần trong mỗi nhóm đối với một số thao tác. Đối với bất kỳ hoạt động nào đó, Thêm và Loại bỏ là rời nhau, Ngăn chặn và Loại bỏ là rời nhau, nhưng Thêm và Ngăn chặn có thể chồng chéo.
Tôi muốn sắp xếp các mảng hoạt động để cho mỗi hoạt động:
- Nếu hoạt động có Ngăn chặn mục, nó được đặt sau một ca phẫu rằng Loại bỏ những con số. Nếu không ngay sau đó, không thể có hoạt động Thêm hoạt động thêm số đó vào giữa Xóa và ngăn chặn trước.
- Nếu hoạt động Xóa mục, tất cả các hoạt động Thêm bất kỳ mục nào trong số những mục này được đặt trước đó.
Trong trường hợp phụ thuộc vòng tròn, chuỗi hoạt động nên xóa càng nhiều số càng tốt và thông báo với tôi rằng nó không thể xóa tất cả các số.
Có tên/triển khai cho loại thuật toán này hoạt động tốt hơn thuật toán tôi có dưới đây không?
Đã thêm 8/23: Tiền thưởng bao gồm các yêu cầu sắp xếp xem xét cả OpCodes (bộ cấu trúc) và InstructionSemantics
(bộ cờ bit từ một điều tra).
Đã thêm sau 8/23: Tôi đã thực hiện cải tiến hiệu suất 89: 1 bằng cách sắp xếp trước các mảng nguồn. Xem câu trả lời hiện tại của tôi để biết chi tiết.
namespace Pimp.Vmx.Compiler.Transforms
{
using System;
using System.Collections.Generic;
using System.Reflection.Emit;
internal interface ITransform
{
IEnumerable<OpCode> RemovedOpCodes { get; }
IEnumerable<OpCode> InsertedOpCodes { get; }
IEnumerable<OpCode> PreventOpCodes { get; }
InstructionSemantics RemovedSemantics { get; }
InstructionSemantics InsertedSemantics { get; }
InstructionSemantics PreventSemantics { get; }
}
[Flags]
internal enum InstructionSemantics
{
None,
ReadBarrier = 1 << 0,
WriteBarrier = 1 << 1,
BoundsCheck = 1 << 2,
NullCheck = 1 << 3,
DivideByZeroCheck = 1 << 4,
AlignmentCheck = 1 << 5,
ArrayElementTypeCheck = 1 << 6,
}
internal class ExampleUtilityClass
{
public static ITransform[] SortTransforms(ITransform[] transforms)
{
throw new MissingMethodException("Gotta do something about this...");
}
}
}
Chỉnh sửa: Dưới dòng này là thông tin cơ bản về những gì tôi đang thực sự làm, trong trường hợp người đang tự hỏi tại sao tôi yêu cầu này. Nó không thay đổi vấn đề, chỉ hiển thị phạm vi.
Tôi có một hệ thống đọc trong danh sách các mục và gửi đến một "mô-đun" khác để xử lý. Mỗi mục là một lệnh trong biểu diễn trung gian của tôi trong trình biên dịch - về cơ bản là một số từ 1 đến ~ 300 cộng với một số kết hợp của khoảng 17 biến tố sẵn có (đếm cờ). Sự phức tạp của hệ thống xử lý (bộ mã máy) là tỷ lệ thuận với số lượng đầu vào duy nhất có thể (số + cờ), nơi tôi phải viết tay mọi bộ xử lý đơn lẻ. Trên hết, tôi phải viết ít nhất 3 hệ thống xử lý độc lập (X86, X64, ARM) - số lượng mã xử lý thực tế mà tôi có thể sử dụng cho nhiều hệ thống xử lý là tối thiểu.
Bằng cách chèn "hoạt động" giữa đọc và xử lý, tôi có thể đảm bảo rằng các mục nhất định không bao giờ xuất hiện để xử lý - tôi làm điều này bằng cách biểu thị số và/hoặc cờ theo các số khác. Tôi có thể mã hóa từng "hoạt động chuyển đổi" trong một hộp đen bằng cách mô tả các hiệu ứng của nó, giúp tôi tiết kiệm rất nhiều sự phức tạp cho mỗi hoạt động. Các phép toán phức tạp và duy nhất cho mỗi phép biến đổi, nhưng dễ dàng hơn nhiều so với hệ thống xử lý. Để hiển thị bao nhiêu thời gian này tiết kiệm, một trong các hoạt động của tôi hoàn toàn loại bỏ 6 lá cờ bằng cách viết các hiệu ứng mong muốn của chúng về mặt số 6 số (không có cờ).
Để giữ mọi thứ trong hộp đen, tôi muốn có thuật toán đặt hàng để thực hiện tất cả các hoạt động tôi viết, yêu cầu chúng có tác động lớn nhất và thông báo cho tôi về cách đơn giản hóa dữ liệu đạt được (các) hệ thống xử lý. Đương nhiên, tôi đang nhắm mục tiêu các mục phức tạp nhất trong phần trình bày trung gian và đơn giản hóa chúng thành số học con trỏ cơ bản nếu có thể, đó là cách dễ nhất để xử lý trong các bộ ghép. :)
Với tất cả những gì đã nói, tôi sẽ thêm ghi chú khác. Các hiệu ứng hoạt động được mô tả là "các hiệu ứng thuộc tính" trong danh sách các hướng dẫn. Nói chung các hoạt động hoạt động tốt, nhưng một số người trong số họ chỉ loại bỏ các con số rơi sau khi các số khác (như loại bỏ tất cả 6 mà không theo một 16). Những người khác loại bỏ tất cả các trường hợp của một số cụ thể có chứa các cờ nhất định. Tôi sẽ xử lý những điều này sau - SAU KHI tôi tìm ra vấn đề cơ bản về bảo đảm thêm/xóa/ngăn chặn được liệt kê ở trên.
Added 8/23:In this image, bạn có thể thấy một hướng dẫn call
(màu xám) mà đã có InstructionSemantics.NullCheck
được xử lý bởi các RemoveNullReferenceChecks
biến để loại bỏ các ngữ nghĩa lá cờ để đổi lấy thêm một cuộc gọi (không có ngữ nghĩa gắn liền với bổ sung gọi một trong hai). Bây giờ người lắp ráp không cần phải hiểu/xử lý InstructionSemantics.NullCheck
, bởi vì nó sẽ không bao giờ nhìn thấy chúng. Không chỉ trích mã ARM - it's a placeholder for now.
@John, nhiều thao tác có thể thêm và/hoặc xóa từng mục. Tôi cần bản sao cuối cùng của * Xóa * để đến sau phiên bản cuối cùng của * Thêm *. –
@John: Kiểm tra chỉnh sửa của tôi bên dưới mô tả của các nhóm. –
Ah, điều đó tạo nên sự khác biệt lớn! Tôi sẽ xóa các nhận xét khác của mình. –