Tôi hiện đang làm việc trên một trình tạo máy quét. Máy phát điện đã hoạt động tốt. Nhưng khi sử dụng các lớp nhân vật, thuật toán sẽ rất chậm.Thuật toán hiệu quả để chuyển đổi một bộ ký tự thành một nfa/dfa
Trình tạo máy quét tạo ra một máy quét cho các tệp được mã hóa UTF8. Phải hỗ trợ đầy đủ các ký tự (0x000000 đến 0x10ffff).
Nếu tôi sử dụng các bộ ký tự lớn, chẳng hạn như toán tử bất kỳ '.' hoặc thuộc tính unicode {L}, nfa (và cũng là dfa) chứa rất nhiều trạng thái (> 10000). Vì vậy, việc chuyển đổi cho nfa thành dfa và tạo dfa tối thiểu mất một thời gian dài (ngay cả khi dfa tối thiểu đầu ra chỉ chứa một vài trạng thái).
Đây là triển khai hiện tại của tôi về việc tạo một bộ ký tự đặt trong nfa.
void CreateNfaPart(int startStateIndex, int endStateIndex, Set<int> characters)
{
transitions[startStateIndex] = CreateEmptyTransitionsArray();
foreach (int character in characters) {
// get the utf8 encoded bytes for the character
byte[] encoded = EncodingHelper.EncodeCharacter(character);
int tStartStateIndex = startStateIndex;
for (int i = 0; i < encoded.Length - 1; i++) {
int tEndStateIndex = transitions[tStartStateIndex][encoded[i]];
if (tEndStateIndex == -1) {
tEndStateIndex = CreateState();
transitions[tEndStateIndex] = CreateEmptyTransitionsArray();
}
transitions[tStartStateIndex][encoded[i]] = tEndStateIndex;
tStartStateIndex = tEndStateIndex;
}
transitions[tStartStateIndex][encoded[encoded.Length - 1]] = endStateIndex;
}
Có ai biết cách thực hiện chức năng hiệu quả hơn nhiều để chỉ tạo các trạng thái cần thiết không?
EDIT:
Để cụ thể hơn tôi cần một chức năng như:
List<Set<byte>[]> Convert(Set<int> characters)
{
???????
}
Một chức năng helper để chuyển đổi một ký tự (int) vào một byte mã hóa UTF8 [] được định nghĩa là:
byte[] EncodeCharacter(int character)
{ ... }
Bạn đang xây dựng một xFA cho đầu vào _byte_? Nó sẽ không dễ dàng hơn (và đáng tin cậy hơn) để hoạt động trên các ký tự (Utf16)? –
Tôi không nghĩ như vậy, kích thước của bảng tra cứu sẽ tăng khi sử dụng ký tự 16 bit. Ngoài ra các tập tin đầu vào điển hình sẽ lớn hơn nếu sử dụng utf16 (so với utf8). – raisyn
Tôi xin lỗi, tôi hiểu lầm! Chấp nhận bất kỳ mã hóa nào sẽ là một lựa chọn tốt cho phiên bản sau này. Nhưng để giữ cho nó đơn giản, tôi nghĩ rằng nó dễ dàng hơn để thực hiện chỉ có một mã hóa, và UTF-8 trông giống như các joice đúng cho tôi. – raisyn