5
내 친구는 죽은 얼굴의 무작위 배치를 비교하여 가장 균일하게 분포 된 얼굴을 찾는 프로그램을 작성했습니다. 특히 얼굴이 단순한 순서가 아닌 경우 특히 그렇습니다.하스켈 팁/왜이 스케일을 선형 적으로 사용하지 않습니까?
저는 멋진 프로그램이 어떤 사람인지에 관해 이야기 할 이유를 찾고 있었기 때문에 그의 프로그램을 haskell로 번역했습니다. 그러나, 나는 haskell에 능숙하지 않다. (이것을 작성하는 데 영원히 걸렸고 거대한 리펙토링을 거쳤다.) 그래서 두 가지 문제가있다.
- 그는 자신의 버전을 최적화하는 데 큰 역할을했으며,이 속도는 그리 빠르지 않으며 선형 적으로 확장되지 않습니다. 나는 꼬리 재귀를 망쳐 놓았 을까 아니면 더 큰 문제 일까?
- 이 코드는 실제로 예측 한 것만 큼 우아하지 않습니다. 나는이 토론 게시판 아니라는 것을 알고,하지만 당신이 어떤 아이디어가 있다면 방법을 단순화하기 위해 나는 나는 모든 귀
이 가장 관련성 코드 :
-- _CENTERS :: [{ x :: Float, y :: Float, z :: Float}]
-- _VALUES :: [Num]
-- Basically just (repeat $ map rand [0.._SIDES]), but never using a seed twice
randstates from = (take _SIDES (infrand from)) : randstates newseed
where infrand seed = seed : infrand (shuffle seed)
newseed = (infrand from) !! (_SIDES + 1)
-- yates shuffle
yates _ (last:[]) = [last]
yates (rand:pass) (swap:order) = choice:yates pass rorder
where choice = order !! index
index = (randfrom rand) `mod` (length order)
rorder = take (index) order ++ swap : drop (index + 1) order
arrangements seed = map arrange $ randstates seed
where arrange rands = yates rands [0.._SIDES - 2]
-- fns comparing arrangements --
arcLength i j = 1/(1 + _WEIGHT * acos(dot3D/_VEC_LEN_SQUARED))
where dot3D = apply x + apply y + apply z
apply fn = (fn i) * (fn j)
matrix arr = map crosscmp arr
where crosscmp s1 = [ value s1 * (distance s1 s2) | s2 <- arr ]
distance a b = arcLength (_CENTERS !! a) (_CENTERS !! b)
value s = fromInteger $ _VALUES !! s
variance arr = sum $ map perside (matrix arr)
where perside s = (sum s - mean)^2
mean = (sum (concat $ matrix arr))/(sides + 1)
sides = fromInteger $ toInteger _SIDES
maxDistr = maximumBy (\a b -> variance a `compare` variance b)
홈페이지는 기본적으로 그냥
입니다print $ maxDistr $ take _TRIALS $ arrangements seed
어쩌면 http://codereview.stackexchange.com을 시도해보십시오. –
분명한 것은리스트 인덱싱은'O (index)'입니다. 귀하의 목록이 정말로 짧지 않다면, 그렇게 될 것입니다. –
감사합니다. 더 관련성이 높은 게시물을 게시합니다. 그래서 정의 측면 0 = _, 측면 1 = _, 등, 또는 내가 배열 같은 다른 데이터 구조를 사용해야합니까? –