2016-07-17 2 views
1

동적 프로그래밍 프로그램을 구현하기 위해 벡터를 사용하여 벡터의 각 요소를 순차적으로 업데이트합니다. 그러나 변하지 않는 벡터에 대해 vector-set이없는 이유는 변하지 않는 벡터에 대해서만 vector-set!이 있습니다. 그러나 불변의 변경 가능한 사전에 대해서는 dict-setdict-set!이 있고 변경 가능하고 변경 가능한 해시 테이블에는 hash-sethash-set!이 있습니다.불변의 벡터 업데이트 요소

+2

당신 말이 맞아, 아니이 기능'벡터 set' 작업에 내장이없는이 정말 필요할 때

은 또한 vector-set를 작성하는 간단 . 그러나 이것을 직접 지원하는 영구 벡터를 제공하는 라이브러리가 있습니다. 예를 들어 [pvector] (http://docs.racket-lang.org/pvector/index.html) 라이브러리는 [set-nth]를 지원합니다 (http://docs.racket-lang.org/collections/collections- api.html # % 28def ._ % 28 % 28lib._data % 2Fcollection..rkt % 29._set-nth % 29 % 29) 및 [update-nth] (http://docs.racket-lang.org/collections /collections-api.html#%28def._%28%28lib._data%2Fcollection..rkt%29._update-nth%29%29) 기능 업데이트를위한 작업입니다. –

+0

@AlexKnauth 예. pvector에게 감사드립니다. 그렇지만 왜 그런지 궁금합니다. 그 이유는 '벡터 세트'를 가질 수 없었습니다. – fluter

+1

'pvector' 라이브러리는 어떻게 구조화 되었기 때문에 전체 벡터를 복사하여 기능적으로 업데이트 할 필요가 없습니다. 그러나 내장 된 벡터는 그러한 구조를 가지고 있지 않으므로 내장 된 벡터에있는 기능상의 '벡터 세트'는 모든 것을 복사해야합니다. 그게 왜 빠졌는지도 모르겠지만 확실하지는 않습니다. –

답변

2

vector-set이 누락 된 이유는 조작을 실현하지 않고 실수로 사용하는 사람을 막는 것입니다. O(n)이 아니고 O(1)이 아닙니다. vector-set!O(1)이기 때문에 누군가가이 실수를 저 지르지는 않습니다.

가 출력
#lang racket 

(define (vector-set v i o) 
    (vector->immutable-vector 
    (for/vector ([j (in-range (vector-length v))]) 
    (if (= i j) 
     o 
     (vector-ref v j))))) 

(vector-set (vector-immutable 10 11 12 13) 2 'a) 

:

'#(10 11 a 13) 
+0

답변 해 주셔서 감사합니다! – fluter