給定一個二維空間中的點列表,您想要在 Haskell中執行函數來找到兩個最近點之間的距離。 例子: 輸入:項目[(1,5),(3,4),(2,8),(-1,2),(-8.6),(7.0),(1.5),(5.5), (4.8),(7.4)] 輸出:2.0Haskell找到兩個最近點之間的距離
假設在列表中的最遠的兩個點之間的距離爲至多10000
Here's我的代碼:
import Data.List
import System.Random
sort_ :: Ord a => [a] -> [a]
sort_ [] = []
sort_ [x] = [x]
sort_ xs = merge (sort_ left) (sort_ right)
where
(left, right) = splitAt (length xs `div` 2) xs
merge [] xs = xs
merge xs [] = xs
merge (x:xs) (y:ys)=
if x <= y then
x : merge xs (y:ys)
else y : merge (x:xs) ys
project :: [(Float,Float)] -> Float
project [] = 0
project (x:xs)=
if null (xs) then
error "The list have only 1 point"
else head(sort_(dstList(x:xs)))
distance :: (Float,Float)->(Float,Float) -> Float
distance (x1,y1) (x2,y2) = sqrt((x1 - x2)^2 + (y1 - y2)^2)
dstList :: [(Float,Float)] -> [Float]
dstList (x:xs)=
if length xs == 1 then
(dstBetween x xs):[]
else (dstBetween x xs):(dstList xs)
dstBetween :: (Float,Float) -> [(Float,Float)] -> Float
dstBetween pnt (x:xs)=
if null (xs) then
distance pnt x
else minimum ((distance pnt):((dstBetween pnt xs)):[])
{-
Calling generator to create a file created at random points
-}
generator = do
putStrLn "Enter File Name"
file <- getLine
g <- newStdGen
let pts = take 1000 . unfoldr (Just . (\([a,b],c)->((a,b),c)) . splitAt 2)
$ randomRs(-1,1) g :: [(Float,Float)]
writeFile file . show $ pts
{-
Call the main to read a file and pass it to the function of project
The function of the project should keep the name 'project' as described
in the statement
-}
main= do
putStrLn "Enter filename to read"
name <- getLine
file <- readFile name
putStrLn . show . project $ readA file
readA::String->[(Float,Float)]
readA = read
我可以執行程序的運行,如下例所示或使用生成器:
in haskell interpreter must鍵入「生成器」,程序會在這裏要求一個包含千分的文件名。並且在Haskell解釋器中生成文件後,必須寫入main,並請求一個文件名,這是使用「generator」創建的文件的名稱。
問題是,對於1000點隨機生成我的程序需要很長時間,在雙核處理器的計算機上約3分鐘。我究竟做錯了什麼?我如何優化代碼以更快地工作?
你是否介紹了你的程序? – Jonke
你爲什麼要刪除這麼多你的帖子?看看你的嘗試是有幫助的。 – AndrewC
我已恢復第二個版本,以恢復上下文。 –