演算法設計與分析(一) 隨機生成元素不重複序列

2021-10-10 16:58:31 字數 1143 閱讀 9061

前言:

因為在一棵樹中,每個結點的關鍵字要求各不相同,因此與之前報告不同,我們要改進我們的隨機數生成演算法來生成互不相同的元素。但在實驗執行中,發現初始生成隨機數組的方法速度非常慢,測試出執行時間,甚至比紅黑樹構建演算法要慢得多,於是嘗試改進生成方法。演算法很簡單,但是不同演算法之間的效能差異明顯。

話不多說,先上實驗結果:

方法一,集合查重法(初始演算法)。

這是最直接想到的方法,因為我們知道集合有很好的查詢特性,用它來儲存已經生成過的元素數值。每次隨機生成元素後,用count()方法判斷是否已經有該元素的出現,若數量不為0,則繼續隨機生成,直到檢測到某元素值在集合中的數量為0,那麼迴圈結束,將新生成的元素插入集合中。

方法二,陣列標記法。

我們開乙個空陣列專門用來記錄給定範圍內的某數值是否已經生成,初始化為0,如果生成過則標為1,每次生成隨機數檢查對應位置,確保同一數值不重複出現。根據實驗測試結果,我們發現執行時間有了大幅度的提公升,在資料規模為1e2、1e3、1e5的時候甚至上公升了兩個數量級,資料量為1e5時,結果尤為顯著。其餘情況也都分別上公升了1個數量級。

但相比之前方法,我們在開始就給出了定長陣列,消耗了更多的空間。於是繼續嘗試改進方法,在確保執行時間的同時,節省一定空間。

方法三,隨機交換法。

首先按序生成陣列值,再隨機生成兩個陣列下標進行交換以打亂順序,迴圈n次以保證陣列足夠隨機。根據實驗測試結果,意外發現該演算法設計出發點是為了節省空間,但是當數量規模達到1e4及以上,執行時間又提公升了乙個數量級。

此方法有個侷限是給出的範圍必須是緊確的,但完全能夠滿足本實驗的要求。至此,改進演算法結束。

演算法設計與分析 交換元素

這道題目是一道考研題,在老師給的幻燈片裡我沒找到,所以就憑著印象描述一遍了 給定乙個順序表,把表裡元素能被5整除的放到表的後半段,不能被整除的放到前半段,要求用盡量少的時間和空間,並給出時間和空間複雜度。這道題還是可以的,看完我就有思路了 前半段,後半段,快排!用兩個指標分別指著表的兩端,就像一趟快...

演算法設計與分析筆記(一)

遞迴與分治策略 遞迴的概念,典型應用 hanoi問題,程式如下 include void hanoi int n,char a,char b,char c void main 分治的基本思想 將乙個規模為n的問題分解成k個規模較小的子問題,然後遞迴解決這些問題。二分搜尋技術 include defi...

演算法設計與分析學習筆記(一)

輸入包含n個整數是陣列a和整數x,求出滿足a i a j x的i和j,如果沒有這樣的元素和,則返回 1,否則返回1 暴力法 思路 設定兩個for迴圈,第乙個設定基準數,然後利用已知數x減去基準數之後,再使用乙個for迴圈來進行匹配減去得到的數,如果存在該數,則返回1.如果不存在,則繼續找下乙個基準數...