數組和鍊表pk篩選法

2021-03-03 書圈

數組和鍊表pk篩選法

耿祥義(2021-1-24)

      結構加算法決定效率。這裡我們用數組和鍊表分別實現篩選法(求素數),發現採用數組要遠遠快於鍊表。當然,用鍊表實現時,我們故意採用了不同的算法,這個算法可以有其他的應用,即不完全依賴於數的性質。所以對初學者,理解這裡的兩種算法對於掌握數組和鍊表都是有益的。單擊閱讀原文下載原始碼(提取碼: 2xxy)。

      篩選法又稱篩法,具體做法是:先把N個自然數按次序排列起來。1不是素數,也不是合數,要划去(合數是指在大於1的整數,能被1和本身整除外,還能被其他數整除的數)。第二個數2是素數留下來,而把2後面所有能被2整除的數都划去。2後面第一個沒划去的數是3,把3留下,再把3後面所有能被3整除的數都划去。3後面第一個沒划去的數是5,把5留下,再把5後面所有能被5整除的數都划去。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部素數。

public interface PrimeNumber {

    public abstract int[] getPrimeNumber(int n);

首先將2到N之間的自然數存在數組中,然後依據篩選法,將划去的數組元素的值設置為0,最後輸出數組中非零的元素值即可。

import java.util.LinkedList;

public class PrimeNumberByArray implements PrimeNumber {

    public int [] getPrimeNumber(int n) {

        int a[] = new int [n],i,j;

        for(i=2;i<a.length;i++){

           a[i]=i;

        }

        for(i=2;i<a.length;i++){

          if(a[i]>0) {

            for(j=i+i;j<a.length;j=j+i) 

               //篩選法,這裡嚴格依賴於數的算數性質

               a[j]=0;

          }

        }

        return a;

    }

}

(2)使用篩法返回新的鍊表,鍊表長度大於0,進行(1)否則進行(3)。

import java.util.LinkedList;

public class PrimeNumberByLinkedList implements PrimeNumber {

    public int [] getPrimeNumber(int n) {

        LinkedList<Integer> list = new LinkedList<Integer>();

        int a[] = new int[list.size()];

        int prime = 0;//存放篩選得到的素數

           prime = list.pollFirst();//得到一個素數

           list= screeningList(list,prime); 

    private LinkedList<Integer> 

    screeningList(LinkedList<Integer> list,int prime){

        for(int i=0;i<list.size();i++) {

當n的值比較大時,數組法沒有卡住,鍊表法已經卡住(當然,n再大二者都得卡住)

1 毫秒=1000000 納秒。

public class MainClass {

    public static void main(String args[]){

         PrimeNumber  pn =new PrimeNumberByArray();

         long startTime = System.nanoTime();

         int  a[] =pn.getPrimeNumber(N);

         long estimatedTime = System.nanoTime() - startTime;

        ("數組篩選"+N+"以內素數用時"+estimatedTime+"納秒");

         pn = new  PrimeNumberByLinkedList();

         startTime = System.nanoTime();

         int  b[] =pn.getPrimeNumber(N);

         estimatedTime = System.nanoTime() - startTime;

         ("鍊表篩選"+N+"以內素數用時"+estimatedTime+"納秒");

         for(int i=0;i<a.length;i++){

               System.out.print(a[i]+"  ");

         ("\n用鍊表篩選得到的不大於"+N+"素數");

         for(int i=0;i<b.length;i++){

               System.out.print(b[i]+"  ");

推薦閱讀

相關焦點

  • Java線性數據結構之數組和鍊表篇
    Java程序中較為廣泛線性結構包含線性表,棧,隊列,雙隊列,數組等。今天詳細講解數組和鍊表結構。數組數組是指將相同的數據類型的元素按照一定順序進行排列的集合,是一塊連續的內存空間。優點:數據是連續的,且隨機訪問速度快,讀寫速度可用複雜度方程式表示為O(1);缺點:執行新增和刪除性能下降,可表示為O(N)。Java程序中ArrayList集合底層基礎支持就是數組實現,ArrayList相比數組而言,程式設計師不必考慮數組長度越界,當元素超出固定長度後,Java程序自動擴張保證容量健壯性。源碼如圖所示:
  • 算法一看就懂之「 數組與鍊表 」
    其實也不是真的用得少,只不過我們在使用的時候被很多高級語言和框架組件封裝好了,真正需要自己去實現的地方比較少而已。但別人封裝好了不代表我們就可以不關注了,數據結構作為程式設計師的內功心法,是非常值得我們多花時間去研究的,我這就翻開書複習複習:本文就先從大家最經常使用的「 數組 」和「 鍊表 」聊起。不過在聊數組和鍊表之前,咱們先看一下數據的邏輯結構分類。
  • 鍊表竟然比數組慢了1000多倍?(動圖+性能評測)
    性能評測了解了數組和鍊表的基礎知識之後,接下來我們正式進入性能評測環節。總結本文我們介紹了數組的概念以及它的優缺點,同時還介紹了單向鍊表、雙向鍊表及循環鍊表的概念以及鍊表的優缺點。我們在最後的評測中可以看出,當我們正常從頭部依次添加元素時,鍊表和數組的性能差不不大。
  • 什麼是鍊表?
    因為像堆,棧,樹,圖等比較複雜的數組結基本上都可以由數組和鍊表來表示,所以掌握數組和鍊表的基本操作十分重要。除了查找性能鍊表不如數組外,還有一個優勢讓數組的性能高於鍊表,這裡引入程序局部性原理,啥叫程序局部性原理。
  • 動畫 | 什麼是鍊表?
    如果說數據結構是算法的基礎,那麼數組和鍊表就是數據結構的基礎。因為像堆,棧,樹,圖等比較複雜的數組結基本上都可以由數組和鍊表來表示,所以掌握數組和鍊表的基本操作十分重要。除了查找性能鍊表不如數組外,還有一個優勢讓數組的性能高於鍊表,這裡引入程序局部性原理,啥叫程序局部性原理。
  • 【鍊表】鍊表加法
    目錄1.題目描述2.解題思路3.解題代碼4.測試結果1.有兩個用鍊表表示的整數
  • 面試官系列 - LeetCode鍊表知識點&題型總結
    我們把內存塊成為鍊表的節點,為了將所有的節點串起來,每個鍊表的節點除了存儲數據之外,還需要記錄鍊表的下一個節點的地址,這個記錄下個節點地址的指針我們叫做後驅指針。搜索鍊表需要O(N)的時間複雜度,這點和數組類似,但是鍊表不能像數組一樣,通過索引的方式以O(1)的時間讀取第n個數。鍊表的優勢在於能夠以較高的效率在任意位置插入或者刪除一個節點。
  • 數據結構之鍊表
    數據是最重要的財富數據結構之鍊表## 什麼是鍊表鍊表一種時間複雜度和空間複雜度為線性的數據結構,通過指針將一個個零散的內存塊連接起來,鍊表的每個內存塊稱為結點。鍊表的種類主要有三種,單鍊表,雙鍊表,雙向循環鍊表。鍊表的優缺點鍊表是一種鏈式結構,使得它對內存沒有太大的要求。可以充分使用散亂的內存空間,插入和刪除的時間複雜度比數組好。但是結構實現起來比較複雜,容易出錯。而且不具備隨機訪問的特性,每次查詢都要從頭節點出發。
  • 圖解堆算法、鍊表、棧與隊列
    為了更加形象,我們常用帶數字的圓圈和線條來表示二叉堆等,但其實都是用數組來表示的。如果根節點在數組中的位置是1,第n個位置的子節點則分別在2n和2n+1位置上。如下圖所描的,第2個位置的子節點在4和5,第4個位置的子節點在8和9。所以我們獲得父節點和子節點的方式如下:
  • VBA中數組的合併與拆分(Join和Split),篩選(filter)的實際應用
    多個字符的合併和字符串按規律的拆分是經常遇到的,如:A-REW-E-RWC-2-RWC 按分隔符"-"拆分成6個字符放在一個數組中;有一組數array(23,45,7,1,76)想用分隔符-連接成一個字符串上面兩種情況的實現即用到:split(字符串,"分隔符") 拆分字符串。
  • ​LeetCode刷題實戰23:合併K個升序鍊表
    今天和大家聊的問題叫做合併K個升序鍊表,我們先來看題面:https://leetcode-cn.com/problems/merge-k-sorted-lists/Given an array of linked-lists lists, each linked list is sorted in ascending order.Merge
  • 一口氣搞懂「鍊表」,就靠這20+張圖了
    順序存儲和鏈式存儲數組—順序存儲數組作為一個順序儲存方式的數據結構,可是有大作為的,它的靈活使用為我們的程序設計帶來了大量的便利;但是,但是,數組最大的缺點就是我們的插入和刪除時需要移動大量的元素,所以呢,大量的消耗時間,以及冗餘度難以接受了。
  • 數組:總結篇
    ❝周末我們做個總結吧❞數組理論基礎數組是非常基礎的數據結構,在面試中,考察數組的題目一般在思維上都不難,主要是考察對代碼的掌控能力也就是說,想法很簡單,但實現起來 可能就不是那麼回事了。首先要知道數組在內存中的存儲方式,這樣才能真正理解數組相關的面試題「數組是存放在連續內存空間上的相同類型數據的集合。」數組可以方便的通過下表索引的方式獲取到下表下對應的數據。
  • 有關鍊表的小技巧,我都給你總結好了
    提到鍊表就不得不提數組,它和數組可以說是數據結構的基礎,那麼它們最主要的區別在於:所以數組最好的性質就是可以隨機訪問 random access,有了 index,可以 O(1) 的時間訪問到元素。而鍊表因為不連續,所以無法 O(1) 的時間定位任意一個元素的位置,那麼就只能從頭開始遍歷。這就造成了它們之間增刪改查上效率的不同。除此之外,鍊表本身的結構與數組也是完全不同的。
  • 結合JAVA詳解鍊表、棧、隊列等數據結構
    這裡我們將接觸到線性表、樹狀圖、圖存儲結構等線性表線性表其實和數組有些類似。我們都知道,所有數據的類型都可以通過最基本的數組指針(引用類型)這兩種最基本的類型構造。總結順序表最大的特點是:查詢快,因為是數組,直接下標出。插入和移除就比較慢了。
  • 【算法系列】面試常用數據結構(二):鍊表
    之前我們講過,數據結構只有兩種:一維數據結構和多維數據結構。一維數據結構最重要的是連續性的數組和非連續性的鍊表,這種連續性和非連續性的特點會一直影響及應用在對應的多維數據結構中。可以說,數組和鍊表是數據結構的核心基礎。今天我們就來總結討論一下,這非連續性的鍊表。
  • 每日一刷之劍指Offer(5)從尾到頭列印鍊表
    return [] res = [] index = listNode while index: res.append(index.val) index = index.next return res[::-1](3)輔助棧法
  • 給Java程式設計師的20個鍊表面試題
    什麼是鍊表?數據結構在程序面試中極其重要。鍊表則是對數組數據結構進行的補充,是另一種常見的數據結構。和數組相似的是,鍊表也是線性數據結構,並以線性方式儲存元素。但是,和數組不同的是,鍊表不將元素儲存在連續的位置;相反,其元素分散在內存中的各個地方,並以節點進行相互連接。鍊表不過是一個節點的列表,其中每一個節點都包含存儲的值和下一個節點的位置。
  • 基本數據結構-鍊表的總結
    鍊表的反轉鍊表反轉再讓結點1的next域指向結點3,最後將結點2的next域指向結點1,頭結點的next域指向結點2。 p->next = list->next;//2的next指向結點1 list->next = p;//頭結點指向結點2 } return list;}怎麼經過一次遍歷求出鍊表的中間值
  • AK leetcode 流浪計劃 - 數組反轉
    一、簡介二、基本操作步驟三、作用四、反轉模板交換元素的方法模板總結1 反轉數組區間2 反轉數組區間中的特定元素五、牛刀小試練習1 反轉字符串題目大意題目解析AC代碼練習2 反轉鍊表題目大意題目解析思路AC代碼練習3 反轉字符串中的元音字母題目大意題目解析AC代碼練習4 反轉字符串中的單詞 III題目大意題目解析AC代碼六、代碼模板七、總結八