bir Data.Vector.Generic.Mutable nesne ve Verilerden bir tür algoritma kullanarak büyük bir dosyada (milyon diyelim ki birkaç satır) okunur ki (dizeleri, vs yüzer). Vector.Algorithms?Data.Vector.Generic.Mutable ile nasıl bir sıralama yapar? Verilerin bir uzun listesini sıralamak nasıl
cevap
Burada genel durumda bunu yapmak için nasıl.
Önce, bir değişken vektörü gerekir. Bu dosyayı adım adım olarak tarayabilirsiniz; İhtiyacınız kadar büyük olan bir vektör tahsis edin, ve alanınızı azalttığınızda boyutu artırın ve kopyalayın. Yoksa , dosyanın tamamını okumak rekor ayırıcılar saymak ve tek seferde alan doğru miktarda ayırabilirsiniz. Bu daha kolay ama muhtemelen Real Life'da kabul edilemez. (Genişletmek-olarak ihtiyaç duyulan strateji oldukça yaygındır; Hiç Perl gibi bir dil kullanmak ve bir dizinin sonuna üzerine bir dosyadan size okumak hatları zorlarsan, bu şey bu Perl bir dizi için biraz boşluk ayırır. , bunu doldururken, bu alan miktarını artırır yeni bir alan ve kopyalarını ayırır.)
Neyse, bu yapamayacak kadar tembelim, bu yüzden sadece bazı rastgele bir vektör oluşturmak için gidiyorum içindeki sayılar. Biz tek seferde buna ihtiyacım yok, ama biz sonunda gerekir
import Control.Monad
import System.Random
import qualified Data.Vector as IV
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector.Generic as V
import qualified Data.Vector.Algorithms.Intro as VA
, bu yüzden ben dışına almak düşündüm:
Bunun için kütüphanelerin bir demet ihtiyaç yol. Neyse, bizim değişebilir vektörümüz MV.MVector
" " şeklinde bir "normal" değişken vektör olacaktır.
kesilebilir bir vektör fikri
bunu oluşturmak ve adımlar sayısında değişiklik olması. Haskell'de, bu kodu arama koduna göre düzeltmek için birkaç yol vardır; Bunlardan biriST
monad içinde yapılıyor. ST eyleminiz vektörü oluşturuyor, değiştiriyor ve 'u "değişmez" bir vektöre "donduruyor". Dahili olarak, değiştirmek-bu-hafıza-yeri-a-demet-of-the zamanlarda işlemlerini hızlı kullanıyor, ancak dışarıdan, saf bir şey var. (Eğer bu güvenlidir neden olarak bir tartışmayı istiyorsanız kağıdı yaklaşık
ST
okuyun.)
değişken veri ile başa çıkmak için başka bir yolu da Herşey içeride bunu sadece üzere, şey, IO
, monad olduğunu. Burada yapacağımız şey bu, en uygunudur.
(Data.Vector.Mutable
sizin için önceden tanımlanmış iki vektör tipleri, IOVector
ve STVector
sahiptir. Biz IO
içine tüm vektör işlemlerini koyar IOVector
kullanıyorsunuz.)
Yani 8 gibi paragraflar önce, gittiğini sort için bir değişken vektör oluşturun. Ve işte buradayız:
randVector :: IO (MV.IOVector Int)
randVector = do
v <- MV.new 10
forM [0..9] $ \x -> do
r <- randomIO :: IO Int
MV.write v x r
return v
Bu İçinde 10 rasgele sayılarla yeni değişken vektörü döndüren bir IO eylemdir.(Rastgele sayı üretme da rahatlıkla IO monad içine kaldırdı olabilir, bu nedenle kolaylık, bu çok yaptı! Biz ancak güzel sözdizimi ve daha tip güvenliği ile C yazıyorsunuz bu.)
aslında o zor bölüm. Sıralama yapmak için, temel olarak yerinde bir quicksort olan Data.Vector.Algorithms.Intro
'u içe aktardım. sort
adlı bir işlev, gerçek sıralama yapar ( 'da, değiştirilebilen vektörün hangisi olduğu).
rastgele değişken vektörü oluşturur ve yerinde bunu sıralar bir eylem benziyor: O yazdırmak için Şimdi
sort = VA.sort =<< randVector
, biz bir iletmenin içine vektörü "dondurmak" yapmanız gereken tüm ve .toList
'u yazdırın. Ya da sadece her elemanın üzerine yineleyebilir ve yazdırabilirsiniz.
Burada bir örnek olarak geldi ne:
main = do
v <- randVector
VA.sort v
iv <- V.unsafeFreeze v :: IO (IV.Vector Int)
print . V.toList $ iv
V.unsafeFreeze
Data.Vector.Generic
kaynaklıdır (sen nasıl etkileşimde aynı API ile tüm vektör türler), V.toList
olduğu gibi. Her neyse, IO'nun burada kolaylık sağlamak için olduğunu da belirtmek gerekir. Dosya verisinden bir vektör oluşturduğunuzdan, uygun. Zamanın% 99 , ST
kullanmanız gerekir. ST işleminizde, vektörünü oluşturun, sıralayın, dondurun ve donmuş sürümü döndürün.
benzer bir örnek STVector
kullanılarak:
randVector :: ST s (Vector Int)
randVector = do
vec <- new 10
rand <- newSTRef 17
forM_ [0..9] $ \index -> do
randN <- readSTRef rand
let randN' = (fst . next . mkStdGen) randN
writeSTRef rand randN'
write vec index randN'
unsafeFreeze vec
sonra çalıştırmak: Ayrıca
*Main> runST randVector
fromList [679560,1422110406,306332632,1905242129,692062628,393451229,355476175,1240028023,873588529,1181443777] :: Data.Vector.Vector
Yardım jrockway için teşekkürler. IO monadından rahatım ama açıkçası ST monad'ı öğrenmem gerek. Örnek kodunuzu çalıştırdıktan sonra, rastgele sayılar yerine vektörü yüklemek için bir dosyadan okumak için değiştirmeye çalışacağım. – Max
Teşekkürler, teşekkür ederim teşekkürler. Genel kullanıma iyi örneklerle ST'ye çok hoş geldiniz. – Benjamin
- 1. sıralama listesi - descedent amacıyla Tarihe Göre Nesnelerin listesini sıralamak için
- 2. VB.net Listesini bir sınıf değerine göre sıralama
- 3. Listeler listesini sıralamak için aritmetik nasıl yapılır?
- 4. r eşitsiz boyutlu vektörlerin bir listesini sıralama
- 5. Python bir tupl listesini nasıl sıralıyor?
- 6. Bir sql görünümü içinde sıralama nasıl
- 7. Nesnelerin bir listesini devamlılık ile nasıl gruplayabilirim?
- 8. laravel eloquent listeleri - Sütun Değerlerinin Bir Listesini Sıralama
- 9. NSLog ile uzun bir değer nasıl kaydedilir?
- 10. Mongoengine: Gömülü belge alan tarafından Gömülü Belge listesini sıralamak nasıl
- 11. C#, mantissa tarafından çiftlerin listesini nasıl sıralamak için?
- 12. Groovy/Grails: kimliğe göre nesnelerin listesini sıralamak nasıl
- 13. Python sıralama listeleri/yükselen listesi ve ben şöyle bir listesini içeren bir liste varsa o zaman
- 14. Dize uzunluğunu alfabetik sıraya göre sıralamak nasıl?
- 15. Sqlite3: bir tablodaki sütunları yeniden sıralamak nasıl?
- 16. Pandalar: pd.DataFrame dizini ile dizin sıralamak için pd.DataFrame'i sıralamak için kullanılır.
- 17. Bir txt dosyasındaki verilerin üzerine nasıl yazılır?
- 18. Metin dosyasındaki satırları ikinci bir metin dosyasına göre sıralamak nasıl
- 19. JsTree: Nasıl klasörleri ile jstree düğümleri sıralamak için üst
- 20. , uzun bir altıgen numarası Nasıl
- 21. Emacs lisp etkileşimli olmayan işlevlerin bir listesini nasıl alabilirim?
- 22. C'deki keyfi uzun bir satırı nasıl okurum?
- 23. Bir içerik sağlayıcısı sorgusu için sıralama düzeni nasıl belirlenir
- 24. Raylarda bir değişkeni html_encode nasıl yapar?
- 25. Bir nesnenin listesini, bir nesnenin bir yönteme verdiği cevaba bağlı olarak sıralamak mümkün mü?
- 26. Realm kullanarak nasıl sıralama yapılır?
- 27. VIM'de dizelerin bir listesini nasıl değiştirebilirim?
- 28. Git ile tüm Push'lerin bir listesini bulun
- 29. Bir işaretçinin kendisi nasıl NULL yapar?
- 30. Glifi bir düğmeyi twitter'e nasıl benzer yapar?
, Data.Vector.Generic.Mutable bir amacı değildir, herhangi bir tür işlemler için soyut API'dır değişken vektör. Bunlar Data.Vector.Unboxed.Mutable, Data.Vector.Storable.Mutable, vb içerir – jrockway