2011-08-15 41 views
5

Tất cả các ..Values chức năng đã cung cấp tài liệu tùy chọn Sort:Tùy chọn "Sắp xếp" của ... Giá trị làm gì?

In[1]:= Options /@ {OwnValues, DownValues, UpValues, SubValues, 
    DefaultValues, FormatValues, NValues} 

Out[1]= {{Sort -> True}, {Sort -> True}, {Sort -> True}, {Sort -> 
    True}, {Sort -> True}, {Sort -> True}, {Sort -> True}} 

gì tùy chọn này và cho những mục đích gì nó có thể hữu ích?

Trả lời

8

Khi bạn nhập định nghĩa cho một hàm, bạn nhập chúng theo một thứ tự cụ thể. Trong trường hợp khi các định nghĩa của bạn không chứa các mẫu, chúng được lưu trữ nội bộ trong một bảng băm. Khi bạn yêu cầu, chúng sẽ được sắp xếp theo mặc định:

In[11]:= 
Clear[g]; 
g[5]=1; 
g[4]=2; 
g[3]=3; 

In[15]:= DownValues[g] 
Out[15]= {HoldPattern[g[3]]:>3,HoldPattern[g[4]]:>2,HoldPattern[g[5]]:>1} 

Tuy nhiên, thường bạn có thể muốn xem thứ tự ban đầu trong đó các giá trị được gán. Sau đây là cách:

In[16]:= DownValues[g,Sort->False] 
Out[16]= {HoldPattern[g[5]]:>1,HoldPattern[g[4]]:>2,HoldPattern[g[3]]:>3} 

Một ví dụ về một trường hợp mà bạn có thể muốn sử dụng nó, là khi bạn cần phải thực hiện một bộ nhớ cache (cố gắng của tôi để làm điều đó dựa trên tùy chọn này có thể được tìm thấy here). Tuy nhiên, đối với một số lượng lớn các định nghĩa, có thể không đảm bảo rằng các định nghĩa sẽ tuân theo thứ tự ban đầu, vì các bảng băm bên trong có thể sẽ được mở rộng và phục hồi nhiều lần. Về cơ bản, việc triển khai bảng băm không đảm bảo thứ tự các cặp khóa-giá trị được lưu trữ. Vì vậy, những gì bạn đạt được bằng cách thiết lập Sort->False...Values không được sắp xếp theo Mathematica trước khi chúng được trả lại cho bạn, vì vậy bạn nhận được chúng khá nhiều theo thứ tự Mathematica hiện đang lưu trữ chúng.

Trường hợp khác khi bạn muốn điều này là khi bạn muốn xây dựng cấu trúc giống từ điển bằng cách sử dụng DownValues - trong trường hợp này, khai thác khóa sẽ nhanh hơn nhiều với Sort->False, vì không sắp xếp trên bộ khóa. các vấn đề cho bộ khóa lớn):

In[31]:= 
Clear[gg]; 
(gg[#]:=200000-#)&/@Range[200000]; 

In[33]:= DownValues[gg][[All,1,1,1]]//Short//Timing 
Out[33]= {4.867,{1,2,3,<<199994>>,199998,199999,200000}} 

In[34]:= DownValues[gg,Sort->False][[All,1,1,1]]//Short//Timing 
Out[34]= {2.103,{95090,102286,<<199996>>,38082,26686}} 

Bạn có thể tìm thấy ví dụ về việc sử dụng như vậy here.

Theo như tôi biết, tùy chọn Sort chỉ ảnh hưởng đến phi mô hình dựa trên DownValues (và ...Values khác), bởi vì đối với mô hình dựa trên DownValues Mathematica nào cố gắng sắp xếp lại chúng theo thứ tự tính tổng quát của họ, vì nó hiểu cái đó. OTOH, đối với mẫu dựa trên mẫu DownValues, bạn có thể thực hiện sắp xếp lại quy tắc thủ công và Mathematica sẽ giữ các thay đổi của bạn, trong khi đối với các định nghĩa không có mẫu, cố gắng sắp xếp lại các định nghĩa theo cách thủ công sau khi chúng ban đầu dường như không ảnh hưởng đến chúng (có thể, một lần nữa vì chúng được băm nội bộ và các bảng băm thường không quan tâm đến thứ tự).

+1

bạn có thể mở rộng một chút về "... vì bảng băm nội bộ có thể sẽ được mở rộng và phục hồi nhiều lần"? – acl

+2

@acl Bảng băm điển hình có dung lượng nhất định - một số yếu tố có thể băm hiệu quả mà không có xác suất va chạm trở nên quá cao. Khi chúng tôi tiếp tục thêm các định nghĩa, tại một số điểm, bảng băm có khả năng thực hiện thay đổi kích thước động, tăng dung lượng của nó. Có thể hoặc không cần phải băm lại các mục nhập hiện có, tùy thuộc vào việc triển khai. Những điều này được giải thích rất độc đáo ở đây: http://en.wikipedia.org/wiki/Hash_table. Hầu hết các bảng băm không duy trì thứ tự của các khóa, nhưng có một số (ví dụ: 'LinkedHashMap' trong Java). –

+0

cảm ơn. Tôi đoán tôi đã hỏi nhiều hơn liệu bạn có quan sát thấy mma đang làm điều này không, và nếu có, làm thế nào. – acl

Các vấn đề liên quan