Scheme語言中的「不可變資料」會產生效能問題嗎?

時間 2021-05-07 03:38:43

1樓:magia

immutable本身不會產生效能上的問題,更多是取決於你的實現比如在SML中

funrev

=|rev

(x::xs)=

(revxs)

@[x];

就比fun

rev2

(,ys)=

ys|rev2

(x::xs,ys

)=rev2(xs

,x::ys

)要慢,前者是O(n^2),後者是O(n)的。

這是命令式語言中的做法,我們簡單的改變xs的尾指標將xs與ys連線成zs,這個操作時間複雜度是O(1)的,雖然高效,但是我們失去了原有的xs與ys,因此我們在需要使用xs和ys時得重新構建。

這種是函式式語言的做法,我們copy了xs中的節點,將它尾指標指向到ys,時間複雜度是O(n),比前面的慢點,但是我們沒有破壞原有的xs和ys,並且我們不用copy ys中的節點,而是將它們與新的zs共享。

2樓:羊羊羊

scheme裡的list壓根就不是不可變的,你可以用set-car!

函式傳參怎麼會複製。

函式式風格的操作是建立新的list而不是複製。

3樓:權少

有沒有效能問題,要看實現,比如傳參時,Scheme標準沒規定是傳物件抑或傳引用 ,傳引用效能好,而且如果是不可變值的,相當於C++裡面的const T&,無後顧之憂,此時不可變是反而是優點。還有map時亦可用惰性求值來避免遍歷,類似於C++的迭代器效果,此時不可變也是優點,因為不用害怕迭代器失效。

4樓:韋易笑

如果頻繁修改容器內容,卻不頻繁追加新元素,避免大量資料複製,可以用 scheme的 vector,沒人逼著你必須用 list,比如:

(define x(

vector 12

34)); 定義一維陣列

(vector-set! x1

100)

; 修改 1位置的元素

(display x)

(newline)(

define y(

vector

(vector 12

)(vector 34

))); 定義二維陣列

(list->vector a)

; 型別轉換

(vector->list x)

; 型別轉換

函式式程式設計所倡導使用的 不可變資料結構 如何保證效能?

StevenGerr 聯絡資料結構單一的資料結構 聯絡實際國際的實體以及實體間的各種聯絡均用聯絡來表明資料的邏輯結構 二維表從使用者視點,聯絡模型中資料的邏輯結構是一張二維表。一 工欲善其事,必先利其器這兒介紹幾個學習C言語必備的裝置和書本 A 開發環境例如turbo C 2.0,這個從前佔據了DO...

R語言中資料篩選的問題?

InfiniteCycle 如果題主對SQL比較熟悉的話,在R中用SQL的語句來進行資料處理會極大地提公升工作效率。假設題主的data.frame的名字叫做 df,可以用以下package和語句進行資料篩選 install.packages sqldf manipulate data with sq...

弱型別語言中資料型別存在的意義?

小烏龜 強型別弱型別,靜態型別動態型別,這些只是概括性的分類而已。php型別不是很強,很多隱含的自動轉換,但是型別資訊確實是存在的,既然存在,有時候就可以加以利用,這是很正常的。 eechen 弱型別語言裡的型別判斷肯定有意義呀.比如不同型別的資料比較,很多時候不僅要比較值是否相等,還要比較型別是否...