我這東西想了很久。我想要用go cache套件存取質數表,以下是我的程式碼。
這邊的QueryCachePrimesInRange()我是想說先看cache裡面的值有沒有東西,如果有值,則先更新cache,cache中有不重複的質數表,從裡面拉出符合start,end區間的質數,如果沒有值就去更新cache,然後再查一次輸出當前答案。
這兩個函式UpdateCachePrimeRange、mergeAndRemoveDuplicates,我是希望用來更新cache的值且不讓他重複,讓他像質數表那樣存著,calculate是算出質數的函式。
但測試的時候有時輸出正常有時沒有值,感覺很像是update那邊出問題,請大神告訴我到底錯在哪裡,或是給我另一個想法關於如何用cache存質數表。
如果要更詳細的程式我會即時更新
我看了幾遍,終於看出問題
cache 的基本概念就是 key-value
用 key 查詢,有兩種結果
1.找得到, 回傳 value 即是查詢結果
2.找不到, 將「別的地方來的值(eg.資料庫或計算結果)」存入 cache 並回傳 value
這篇是個很簡單扼要的範例
由此可以看出,key 的定義
比對你的程式
你查詢用的是 start 和 end
但你的 key 值卻是 prime 定字
這代表不管你用什麼 start,end,每次查詢cache都會「找得到」
結果自然不如預期
等你想通之後,你會發現
程式比原來這個版本簡單很多
另外請教
真正原始的題目是不是「用 cache 機制改善 isPrime 函數的效能」
而不是「用go cache存質數表」?
如果是我會這樣寫, 參考看看
isPrime(x) : 判斷 x 是否是質數
start, end
cachePrimes : 存放質數的 cache
result : 存放結果的變數
for i = start to end {
if i in cachePrimes { #代表 i 是質數
result.add(i)
} else {
if isPrime(i) { #是質數
result.add(i)
cachePrimes.add(i)
}
}
}
寫完收工放飯
上面的寫法是基於「用 cache 存質數表」的命題
其實比較完整的寫法應該是
存放所有數字,以及其是否為質數
如此才可以達到每個數字判斷是否為質數的動作, 只需做一次即可
isPrime(x) : 判斷 x 是否是質數
start, end
cachePrimes : 存放所有數字的 cache
result : 存放結果的變數
for i = start to end {
if i in cachePrimes {
if cachePrimes(i) = 'Y' {#是質數
result.add(i)
}
} else {
if isPrime(i) { #是質數
result.add(i)
cachePrimes.add(i, 'Y')
} else {
cachePrimes.add(i, 'N')
}
}
}
感謝尼,我等下來實作看看
這樣的確有把query和update的功能合起來,測資也比我自己想的快。太猛了
用資料庫做範圍查詢就好.
這裡就有已經計算好的
ttps://www.mathsisfun.com/numbers/prime-number-lists.html
舉例就只下載第一部分:
wget https://www.mathsisfun.com/includes/primes-to-100k.zip
解壓
unzip primes-to-100k.zip
建立table
create table primes (
id bigint not null generated always as identity primary key
, prime decimal(16)
);
將primes-to-100k.txt 載入
\copy primes(prime) from 'primes-to-100k.txt'
列出 500 ~ 1000 之間的質數
select prime
from primes
where prime >= 500
and prime <= 1000;
prime
-------
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
(73 rows)
merge的地方出了問題吧
你把已經算好的質數陣列列表拿去跟新算好做比較這沒問題
問題是你existingMap跟merged是兩個東西
這時候[]newValues int{}只要是空陣列完全沒東西
existingMap就直接吐空的merged回去了
應該是要比較existingMap沒有就加進去而且return existingMap
轉型也沒做檢查跟沒處理err
演算法也有問題,每次都要sort時間複雜度超高
下次程式碼別用截圖的,而且附上你的測試資料
然後沒事就到處print
這個問題問的不好
要簡化問題。
如果是質數問題,就只問質數問題。
如果是 cache,就只問 cache 的問題就好了。
cache 大概要考慮的東西
如果不需要 thread safe,直接用 map/slice 弄就可以了。
只是需要設計一個方便寫方便讀,時間複雜度/空間複雜度在可以接受範圍內的解法就可以了
By the way. 真看不出你主管是好人還是壞人了
給了很多空間可以亂玩
但是方向似乎給的不夠