Các cấu trúc dữ liệu đằng sau một bảng tính là gì?


35

Tôi muốn hiểu làm thế nào một bảng tính (một nhóm các ô được đặt tên hoặc được xác định khác có chứa các giá trị hoặc công thức tham chiếu đến các ô khác) được giải quyết. Tôi đã thử xem xét các dự án hiện có, nhưng có quá nhiều thứ đang diễn ra với GUI, tuần tự hóa, sự kiện, v.v. mà tôi không thể tìm thấy bảng tính.

Đơn giản nhất nó hoạt động như thế nào?


1
Nếu bạn muốn xem triển khai bảng tính có gui rất tối thiểu (và do đó ít gây mất tập trung hơn cho vấn đề), hãy xem sc: linuxjournal.com/article/10699?page=0,0
itbruce

Câu trả lời:


21

Tại cốt lõi của nó, một bảng tính là một ngôn ngữ chức năng với kiểu gõ động và mỗi chức năng hoặc giá trị có thể được tham chiếu như một ô trong ma trận.

Thay vì những thứ như (defn some-name ...)các some-namephần được đặt trong một tế bào riêng của mình.

Nếu bạn đi đến một ide ngôn ngữ chức năng cập nhật động (chẳng hạn như lighttable cho clojure), bạn sẽ thấy nhiều chức năng tương tự như một bảng tính. Liên kết một giá trị với một tên, viết một hàm sử dụng giá trị đó, thay đổi giá trị và đầu ra của hàm thay đổi ngay lập tức. Điều này giống như làm một cái gì đó như viết =A1 + B2ở vị trí của C3excel.

Vì vậy, các lập trình viên chức năng thường thích viết bảng tính như các chương trình đồ chơi ... và chủ đề của các tài liệu nghiên cứu cũng vậy. (Vâng, tôi xin lỗi, tất cả họ đều đứng sau một tường thành ACM.org)

  • Lập trình chức năng bảng tính

    Cộng đồng lập trình chức năng đã thể hiện sự quan tâm đến bảng tính, nhưng đáng ngạc nhiên là dường như không ai đã xem xét việc tạo một bảng tính tiêu chuẩn, như Excel, làm việc với ngôn ngữ lập trình chức năng tiêu chuẩn, chẳng hạn như Haskell. Trong bài báo này, chúng tôi chỉ ra một cách mà điều này có thể được thực hiện. Hy vọng của chúng tôi là bằng cách làm như vậy, chúng tôi có thể khiến các lập trình viên bảng tính thử nghiệm lập trình chức năng.

  • Biểu mẫu / 3: Một ngôn ngữ hình ảnh thứ nhất để khám phá các ranh giới của mô hình bảng tính

    Mặc dù những người gièm pha lập trình chức năng đôi khi cho rằng lập trình chức năng quá khó hoặc phản trực giác đối với hầu hết các lập trình viên để hiểu và sử dụng, bằng chứng ngược lại có thể được tìm thấy bằng cách nhìn vào sự phổ biến của bảng tính. Mô hình bảng tính, một tập hợp con thứ nhất của mô hình lập trình chức năng, đã tìm thấy sự chấp nhận rộng rãi giữa cả lập trình viên và người dùng cuối. Tuy nhiên, có nhiều hạn chế với hầu hết các hệ thống bảng tính. Trong bài viết này, chúng tôi thảo luận về các tính năng ngôn ngữ loại bỏ một số hạn chế này mà không đi lệch khỏi mô hình đánh giá khai báo, đặt hàng đầu tiên.

  • Thực hiện bảng tính chức năng

    Một lượng lớn phát triển người dùng cuối được thực hiện với bảng tính. Ẩn dụ bảng tính rất hấp dẫn bởi vì nó trực quan và phù hợp với thử nghiệm tương tác, nhưng theo quan sát của Peyton Jones, Blackwell và Burnett, ẩn dụ bảng tính không thừa nhận ngay cả sự trừu tượng cơ bản nhất: đó là biến một biểu thức thành một hàm được đặt tên. Do đó, họ đã đề xuất một cách để xác định hàm theo bảng tính với các ô đầu vào và đầu ra được chỉ định; chúng ta sẽ gọi nó là một bảng chức năng.


Bắt đầu Bảng tính tại Wikipedia đưa ra một số gợi ý về cách triển khai:

Một bảng tính là một chương trình ứng dụng máy tính tương tác để tổ chức và phân tích dữ liệu ở dạng bảng. Bảng tính được phát triển dưới dạng mô phỏng trên máy vi tính của bảng tính kế toán giấy. Chương trình hoạt động trên dữ liệu được biểu diễn dưới dạng các ô của một mảng, được sắp xếp theo hàng và cột. Mỗi ô của mảng là một phần tử bộ điều khiển của bộ xem mô hình, có thể chứa dữ liệu số hoặc văn bản hoặc kết quả của các công thức tự động tính toán và hiển thị một giá trị dựa trên nội dung của các ô khác.

Dựa trên mô hình này từ mô hình Outline of Model-View-Controller như được thể hiện trong các thư viện Java . Tác giả tiếp tục đề cập đến các applet (một chút ngày tháng, nó được viết vào năm '93 -96) và đề cập đến trang web của anh ta vào http://csis.pace.edu/~bergin/Java/applets.htmlm (có , applet) cho mã bảng tính tương ứng http://csis.pace.edu/~bergin/Java/S Lansheet.java

Tôi sẽ chỉ ra rằng toàn bộ bảng tính, không phải là lớn trong applet 570 dòng này bao gồm cả tài liệu.

Điều đó nói rằng, tùy thuộc vào ngôn ngữ, bạn có thể có thể làm tất cả chỉ với các con trỏ hàm trong một mảng thưa thớt.


32

Về mặt khái niệm, mỗi ô là một nút của biểu đồ chu kỳ có hướng và các tham chiếu đến các ô khác tạo các cạnh trong biểu đồ đó. Khi bạn thay đổi một ô, việc sắp xếp theo cấu trúc liên kết của tất cả các nút có thể truy cập từ ô bạn đã thay đổi sẽ đưa ra thứ tự bạn cần để đánh giá các ô. Khi bạn đã xác định đúng thứ tự, đó chỉ là phân tích cú pháp biểu thức chuẩn.


3
Chà, gọi tôi là nitty nhưng không có gì đảm bảo rằng bạn không thể tạo bất kỳ chu kỳ nào trong bảng tính. Trên thực tế, tôi vừa thử nghiệm điều này với Excel, nhận được cảnh báo nhưng bằng cách bỏ qua nó, tôi có thể dễ dàng tạo một tham chiếu theo chu kỳ.
Doc Brown

1
@DocBrown Để tránh bị cuốn vào vòng lặp và đóng băng chương trình, nó có thể bị cắt ở liên kết cuối cùng, liên kết sẽ gây ra nó.
Izkata

1
Điểm tốt, @DocBrown. Bạn vẫn phải phát hiện chu trình và coi nó như một DAG cho mục đích tính toán, ngay cả khi bạn quyết định cho phép đệ quy. Bạn chỉ cần đi qua đơn hàng đó nhiều lần.
Karl Bielefeldt

Những cấu trúc dữ liệu nào có thể được sử dụng để mô phỏng loại phụ thuộc DAG này? Tôi đã kiểm tra ma trận kề nhưng với một mảng * n, chúng tôi không thể liên kết các thuộc tính với các nút và cạnh. Ví dụ: công thức trên ô sẽ là một trong những thuộc tính
Andy Dufresne

6

Như đã đề cập, một bảng tính được thực hiện dễ dàng dưới dạng DAG (biểu đồ chu kỳ có hướng) được lưu trữ trong một hàm băm hoặc từ điển đơn giản. Một số mã đơn giản để chơi với có lẽ là cách dễ nhất để hiểu nó:

Một phiên bản Python rất đơn giản: http://code.activestate.com/recipes/355045-s lâysheet /

Điều này đã được giải thích và xây dựng trong bài đăng trên blog này: http://ralsina.me/weblog/posts/BB585.html

Cũng có một phiên bản JavaScript đơn giản với GUI tại đây: http://jsfiddle.net/ondras/hYfN3/


0

Tôi đã mã hóa gói python cho phép bạn chuyển đổi cấu trúc ô mục tiêu tệp MS Excel thành Python. XL2py

Các giá trị ô được phân tích cú pháp thành một đối tượng kiểu dict () nối các giá trị của chúng. Các ô có tham chiếu đến các ô khác theo công thức bao gồm các nút. Các nút đề cập đến một ô có giá trị được xác định bởi công thức của nó. Từ mỗi công thức nút, một cấu trúc phụ thuộc được xác định để xác định xem các tham chiếu vòng có tồn tại hay không. Các lệnh tính toán nút được xác định bằng cách tính đến các cấu trúc phụ thuộc các ô liên quan.

Theo cấu trúc cây I / O, bạn có thể sử dụng bất kỳ thuật toán thu nhỏ nào thực hiện trong Python theo ý muốn của bạn.

Tôi sẽ đề nghị bạn hãy xem https://github.com/gusmaogabriels/XL2py

Trân trọng, Gabriel

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.