Đây là câu hỏi phỏng vấn. Bạn sẽ sử dụng cấu trúc dữ liệu nào để lưu trữ văn bản trong trình soạn thảo văn bản?Cấu trúc dữ liệu cho trình soạn thảo văn bản
Trả lời
Trên bộ xử lý văn bản ZX-Spectrum cũ (hoặc hơn nữa, tôi không biết) đã sử dụng cấu trúc rất đơn giản.
Có một bộ đệm lớn, chiếm toàn bộ RAM miễn phí. Văn bản được chia thành hai phần tại con trỏ. Phần trước con trỏ, được đặt ở đầu bộ đệm và phần còn lại ở cuối bộ đệm. Khi nhập văn bản, dữ liệu chỉ được thêm vào phần cuối của phần đầu tiên và khi di chuyển con trỏ, văn bản được sao chép ra và quay lại. bố trí
Buffer:
Hello, World!
^------Cursor here
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|H|e|l|l|o|,| |W| <free> |o|r|l|d|!|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ^ ^ |
begin cur1 cur2 end
Đó là, làm thế nào một số chỉnh sửa hoạt động đã được thực hiện:
Type a char: buffer[cur1++] = character
Backspace: cur1--
Cursor left: buffer[--cur2] = buffer[--cur1]
Cursor right: buffer[cur1++] = buffer[cur2++]
Buffer trong hành động:
Hello, W..............orld!
Press right ^ ^
Hello, Wo..............rld!
Press backspace ^ ^
Hello, W...............rld!
Press 0 ^ ^
Hello, W0..............rld!
^ ^
Để tham khảo: Đây được gọi là "bộ đệm gab". Hầu hết các triển khai không di chuyển bộ đệm khi bạn di chuyển con trỏ. Họ chỉ thực hiện thao tác chèn/xóa. –
@Aaron Digulla: Cảm ơn, bổ sung tốt. Cả hai triển khai đều có lý do của chúng. – Vovanium
Có lỗi đánh máy ở đó: nó được gọi là ** khoảng trống đệm ** Và đây là [thông tin thêm từ Wikipedia] (http://en.wikipedia.org/wiki/Gap_buffer) –
Bạn có thể tìm thấy điều này thú vị, thậm chí nếu nó không chính xác trả lời câu hỏi của bạn:
Most efficient data structure to add styles to text
Tôi hy vọng rằng các cuộc thảo luận sẽ đi đến những nơi hấp dẫn :-)
Một sợi dây cơ bản là cây nhị phân có lá là mảng ký tự. Một nút trong cây có một con trái và một con phải - con trái là phần đầu tiên của chuỗi, trong khi con phải là phần cuối cùng của chuỗi. Nối hai dây chỉ đơn giản là liên quan đến việc tạo ra một nút cây mới với cả hai dây thừng như trẻ em. Để đảm bảo lập chỉ mục thời gian logarit và các hoạt động chuỗi con, dây dẫn có thể cần được cân bằng. Có thể có nhiều chiến lược cân bằng khác nhau.
Ưu điểm chính của dây so với lưu trữ chuỗi là mảng ký tự là chúng cho phép nối nhanh hơn nhiều so với chuỗi thông thường và không yêu cầu dung lượng bộ nhớ tiếp giáp lớn để lưu trữ chuỗi lớn. Những bất lợi chính là sử dụng không gian tổng thể lớn hơn và lập chỉ mục chậm hơn, cả hai đều trở nên nghiêm trọng hơn khi cấu trúc cây trở nên lớn hơn và sâu hơn. Tuy nhiên, nhiều ứng dụng thực tế của việc lập chỉ mục chỉ liên quan đến phép lặp qua chuỗi, mà vẫn còn nhanh miễn là các nút lá đủ lớn để hưởng lợi từ các hiệu ứng bộ nhớ cache.
+1 cho tôi biết cấu trúc tôi đã phát minh lại (sic), được mô tả và đề xuất trong một trong các bài đăng của tôi được gọi là chính thức :-) – thkala
@thkala: thanh toán Để làm một số nghiên cứu đầu tiên - không có gì mới dưới mặt trời ;-) –
Cũng như nối, dây thường tương đối tốt (so với lưu trữ liền kề hoàn toàn) cho nhiều thao tác xóa, chèn và thay thế, đặc biệt là gần đầu tài liệu hoặc ở đâu phát triển bộ nhớ tiếp giáp sẽ yêu cầu di chuyển trong bộ nhớ. –
Tôi biết đó là quá muộn cho một câu trả lời, nhưng tôi tìm thấy The Craft of Text Editing cuốn sách thực sự hữu ích. Nó chứa mô tả của một số mô hình bộ đệm với ưu và nhược điểm của chúng. Thật không may, nó không đề cập đến cấu trúc dữ liệu Ropes.
Khi @Vovanium đã đề cập đến lý thuyết cơ bản về cách bộ đệm khoảng cách có thể được sử dụng, tôi đã triển khai phiên bản C/C++.
Code:
#include <stdio.h>
#define SZ 1000
char leftArray[SZ], rightArray[SZ];
int leftCount, rightCount;
int cursorPos;
/*
* Private APIs
*/
void printArray(){
for(register int i = 0; i < leftCount; i++){
printf("%c", leftArray[i]);
}
for(register int i = rightCount - 1; i >= 0; i--){
printf("%c", rightArray[i]);
}
printf("\n");
}
void adjust(int pos){
while(leftCount > pos){
rightArray[rightCount++] = leftArray[--leftCount];
}
while(leftCount < pos){
leftArray[leftCount++] = rightArray[--rightCount];
}
}
/*
* Public APIs for Text Editor
*/
void init(){
cursorPos = leftCount = rightCount = 0;
}
void addWord(char word[], int len){
adjust(cursorPos);
for(register int i = 0; i < len; i++){
leftArray[leftCount++] = word[i];
}
leftArray[leftCount] = 0;
}
void addBackSpace(){
adjust(cursorPos);
leftCount--;
}
void moveCurson(int newPosition){
cursorPos = newPosition;
}
void subString(int pos, int length, char result[]){
adjust(cursorPos);
int k = 0;
int l = 0;
while(k + pos < leftCount && k < length){
result[k] = leftArray[pos + k];
k++;
}
length -= k;
while(l < length){
result[k++] = rightArray[rightCount - 1 - l];
l++;
}
}
- 1. Trình soạn thảo văn bản cho hội
- 2. Nguồn cấp dữ liệu và podcast cho trình soạn thảo văn bản vim
- 3. Trình soạn thảo văn bản với Scripting ... cho Linux
- 4. Trình soạn thảo văn bản phong phú Qt - có sẵn một trình soạn thảo văn bản chưa?
- 5. Văn bản chưa được cấu trúc cho dữ liệu có cấu trúc
- 6. Cấu trúc dữ liệu tốt nhất phù hợp để thực hiện trình soạn thảo như notepad là gì?
- 7. Tìm kiếm điều khiển trình soạn thảo .NET "văn bản"
- 8. Làm thế nào để biến contentEditable thành một trình soạn thảo đánh dấu có cấu trúc?
- 9. Trình soạn thảo văn bản với chú thích gói
- 10. Cần trình soạn thảo văn bản đa dạng ASP.Net/MVC
- 11. cách viết trình soạn thảo văn bản trong C++
- 12. Dấu lề phải trong trình soạn thảo văn bản VS2010
- 13. Tạo trình soạn thảo văn bản phong phú AngularJS
- 14. Mở trình soạn thảo văn bản mặc định trong bash?
- 15. Hình thức hủy cấu trúc và tính năng Soạn thảo?
- 16. Trình soạn thảo CoffeeScript cho MacOS
- 17. Trình soạn thảo HTML cho CBuilder/Delphi
- 18. Trình soạn thảo PHP cho Ubuntu
- 19. Gợi ý cho trình soạn thảo WYSIWYG cho màn hình nhập dữ liệu dựa trên web?
- 20. Cấu trúc dữ liệu hiệu quả nhất để thêm kiểu vào văn bản
- 21. Đề xuất cho trình soạn thảo văn bản của Windows cho R
- 22. SlickGrid chọn trình soạn thảo
- 23. Chương trình soạn thảo S3DB
- 24. Trình soạn thảo XSD Eclipse
- 25. Cấu trúc dữ liệu cho Quy trình Quyết định Markov
- 26. VS 2010 - đặt tỷ lệ mặc định cho trình soạn thảo văn bản
- 27. Trình soạn thảo văn bản nào hỗ trợ làm nổi bật cú pháp cho mã wiki?
- 28. Trình soạn thảo văn bản tốt cho đám mây là gì?
- 29. Thư viện trình soạn thảo văn bản đa dạng cho iOS
- 30. Trình soạn thảo văn bản nào cho Windows hoặc Linux hỗ trợ cú pháp Objective-C?
Xin xem: [Lưu Trữ lý thuyết biên tập] (http: // stackoverflow.com/questions/3169440/text-editor-theory/3169491) –