《程式設計珠璣》筆記三

2021-10-02 13:05:52 字數 1852 閱讀 9678

昨晚並沒有完成理想中的任務,同時昨天也沒有完習題第三題的解答。自己思考的結果沒有完成,並且解法二也沒有自己在機器上實現,所以今天用25分鐘來完成習題3的思考以後,便是對後面幾題的解答好了,先讀一下昨天的思考。

簡單總結下昨天的思路,如下圖所示。

graph td

a(思路) -->b(自己推導)

a -->c(同餘定理)

b -->d(直接生成數列)

b -->e(生成單個隨機數再生成數列)

%% 直接生成數列:

%% 用列舉的方法將全部結果。結果列出,然後用生成隨機數的方法,在裡面取乙個作為生成出的隨機數列,這方法雖雖然有點蠢,但是不是不可行。

%% 同餘定理:

%% 用取模運算加上移位運算來將乙個數生成乙個與當今函式看起來完全沒有關係的書。

在這裡又打算用同餘定理來解這道題,即暫時放棄其他的想法。同時決定要在今日的晚些時候來實現由我自己寫的同餘定理的**,除錯並計算程式執行的時間,並與mp外的標準庫函式的執行時間作乙個簡單的比較,只要不是太緩慢我都可以接受。

好了開始設計,先寫乙個簡單的文字,等上機後面再根據資料量再來調整,移位的原理即是乘除。二進位制的移位是乘除2,十進位制的移位便是乘除10

首先用97 98 99來當做實驗資料。

公式如下。

result = (n % 2333 * 13 + 56) // 10

%% 因計算器沒有去於這個運算子,所以只能中午晚上用電腦做。

練習五:

如果嚴格規定空間為1m,那麼該如何處理演算法與執行時間又是多少?

我能想到的是兩方面,一是優化現有的**,第二重新設計。

%% (很好,講想法都列出來了,有很大的進步。)

先說優化,我覺得可以將其分為兩次來操作,因為共有一千萬條資料,第一次就是先遍歷前500萬個,然後將第二次遍歷後後面的500萬個。

1 m = 1000 kb = 1000000 b = 8000000 bit

方法是可行的,時間就是以前的兩倍,因為遍歷了兩次。

再說重新設計,我覺得也可以。因為這個問題是乙個實際問題,它資料密集度可能很高,那麼我們便可以將n個連續的1用二進位制表示,那麼便可節約很大的空間。

比如將連續的三個一轉換成二進位制,

例:資料[1,2,3,5,8,13]

則有,011101001000100 ,用(11)(二進位制的3)表示有3個1是連續的

則有,01101001000100

可能這組資料不能說明問題,那我們來換一組資料。

[1,2,3,4,5,7,9,12,13,14,15]

0111110101001111

0,101,010100,100,

好了,現在出問題了,因為都是0與1,怎麼判斷那幾個零與一是連起的就是個問題了。所以我覺得我們有必要引入『n位二進位制』這個概念了,那麼問題來了,這個n該設定為多少?

2^32 = 4297967295

32位好像是足夠了。

1m / 32bit = 250000

1m記憶體可以存放25萬個int位元組(int為四個位元組,每個位元組8位,則int為32位)

下面便要考慮資料的連續性,如果程式設計師先生的資料有25萬次不連續,那麼便不可以用這個方法,一千萬個數,25萬次不連續可能還是有點困難的吧。

25萬 / 1千萬 = 1 / 400 = 0.25 %

若連續的概率要超過99.75%,即400個數才可以有一次斷裂,我覺得這還是難為人家了,但是將此方法寫出來,便是有意義的。

《程式設計珠璣》讀書筆記(三)

程式設計珠璣 的第二部分講的是效能,第三部分講的是應用,所以我暫時跳過第二部分,直接看應用。第十一章 排序 排序問題一直是面試的熱點!本章首先介紹了插入排序,然後介紹了快速排序,並提出了快速排序的幾種改進方法,例如雙向劃分 隨機數劃分 以及小範圍結合插入排序,三種的效能遞增。排序免不了交換,書中特別...

《程式設計珠璣》看書筆記

臨睡前翻看了下 程式設計珠璣 續 這本書,看到第一章就被吸引了,效能監視工具這節從計算素數入手。題目是 列印所有小於1000的素數 簡單直白的方法就是,針對每個小於1000的數字n,從2開始到n 1,如果能被任意乙個數整除,那它就不是素數。如下 int prime int n return 1 in...

程式設計珠璣筆記1

乙個檔案裡有1千萬 10000000 個7位的整數 小於1千萬 給大約1m記憶體讓排序 向量旋轉 abcdefgh 長度n為8 向左旋轉i 3次 某檔案包含40億個隨機次序32位整數,其中有乙個整數未出現,找出來。限制 記憶體幾百位元組,若干順序檔案。乙個詞典有230000個單詞,file和life...