交換機資料預處理系統之資料排序分析

2021-06-06 02:29:34 字數 4063 閱讀 7078

排序對於處理大型的資料時,是一件比較麻煩的事,特別是對於海量資料的排序,這時選擇合適的排序演算法是十分重要的,比如冒泡和選擇排序來說,它們的時間複雜度都是o(n2),它的效率對於百條以內的資料是十分有效的,但是一旦資料達到了上千條,甚至上萬條,百萬條。這時還使用此類排序演算法顯然是很不明智的。那麼,我們應當選擇何種排序演算法呢?資料結構中給我們提供了很多的排序演算法,我們該使用哪一種呢?我們在這裡做乙個簡單的分析,看哪種排序更加適合。下面給出了一些常見的排序演算法及其時間複雜度。

插入排序 o(n2)

氣泡排序 o(n2)

選擇排序 o(n2)

快速排序 o(n log n)

堆排序 o(n log n)

歸併排序 o(n log n)

基數排序 o(n)

希爾排序 o(n1.25)

插入和冒泡、選擇我們就不做考慮了,現在主要分析後面的幾種排序演算法。

快速排序是所有排序演算法中最高效的一種。它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了。這是一種先進的思想,也是它高效的原因。因為在排序演算法中,演算法的高效與否與列表中數字間的比較次數有直接的關係,而"保證列表的前半部分都小於後半部分"就使得前半部分的任何乙個數從此以後都不再跟後半部分的數進行比較了,大大減少了數字間不必要的比較。但查詢資料得另當別論了。

但是,快排存在乙個問題,那就是實現函式的遞迴呼叫,有人也許就會問了,這和遞迴又有什麼關係呢?不好意識,有關係而且關係很大,因為遞迴呼叫是使用的是棧空間,而記憶體中的棧空間的大小是有限的。根據實踐經驗(當然是一些技術強人的實驗結果)一旦遞迴超過8000次以上,就會出現棧空間溢位的問題。而對於我們動輒就上萬條資料來說,選擇快排並非是明智之舉。

堆排序與前面的演算法都不同,它是這樣的:

堆排和快排都使用了分治的思想。

首先新建乙個空列表,作用與插入排序中的"有序列表"相同。

找到數列中最大的數字,將其加在"有序列表"的末尾,並將其從原數列中刪除。

重複2號步驟,直至原數列為空。

堆排序的平均時間複雜度為nlogn,效率高(因為有堆這種資料結構以及它奇妙的特徵,使得"找到數列中最大的數字"這樣的操作只需要o(1)的時間複雜度,維護需要logn的時間複雜度),但是實現相對複雜(可以說是這裡7種演算法中比較難實現的)。

看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的演算法。至少,他們的時間複雜度差了乙個數量級,乙個是平方級的,乙個是對數級的。

歸併排序是將兩個或兩個以上的有序子表合併成乙個新的有序表。初始時,把含有n個結點的待排序序列看作由n個長度都為1的有序子表組成,將它們依次兩兩歸併得到長度為2的若干有序子表,再對它們兩兩合併。直到得到長度為n的有序表,排序結束。

歸併排序是一種穩定的排序,可用順序儲存結構,也易於在鍊錶上實現,對長度為n的檔案,需進行log2n趟二路歸併,每趟歸併的時間為o(n),故其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlog2n)。歸併排序需要乙個輔助向量來暫存兩個有序子檔案歸併的結果,故其輔助空間複雜度為o(n),顯然它不是就地排序。它是以空間來換時間的排序演算法,如果資料的條數過於龐大,那輔助空間就不可預計了,所以不建議使用此中排序方法。

呵呵,由於本人對於後面的兩種排序演算法不是很了解,在此就不做分析了。我們就選擇效能比較穩定的堆排序來做分析!

讓我們正式開始吧!

首先,我們知道計算機的資料儲存在磁碟上是以0、1**進行儲存的。那麼以什麼方式開啟此檔案那是由程式設計師決定的,比如對於字母a來說,我們以字元進行解讀那它就是a,如果以整形來進行解讀那它就是97了,好知道這個後,問題就變得十分簡單了,我們可以先對檔案中的記錄讀入記憶體,然後在記憶體中進行解讀。

01  1234584  01  123         01:00:28  01:00:33 $2 000004 0001 0002

01  5645464  01  16450540    01:00:53  01:01:57 1996/09/06 000063 0002 0002

01  8754545  01  165465401   01:09:53  01:12:10 1996/09/06 000136 0003 0002

01  2721241  01  123         01:12:50  01:32:26 1996/09/06 001176 0020 0002

01  2656232  01  7254620     10:11:39  10:14:48 1996/09/06 000189 0008 0002

01  2721168  01  0878526     10:31:31  10:31:48 1996/09/06 000017 0002 0003

01  2721168  01  5854465     10:55:19  10:59:55 1996/09/06 000276 0010 0002

我們現在要做的就是猜想此檔案的結構了,你可以把它全部當成int來處理,也可以把它當做char型來處理。那我們先分析一下這兩種解析方式的利弊吧。

我們把他們當做int來進行處理,無非是上面的資料看上去都是int型別的資料,這也無可厚非的,但是,從第四列的資料你就可以看出乙個問題,那就是資料長度不一致?我們知道int型別的資料是有長度限制的,int最長不能超過231-1,unsigned int最長不能超過232,而一旦裡面出現乙個超過它的表示範圍的,那就會造成資料丟失,如果此項是銀行存款的話,那這裡的損失無疑是不可計量的。

那我們分析一下char型別的好處吧,首先,它沒有長度的限制,我無非是多申請一些空間而已,還有就是排序是需要資料間的對比的,c語言中對於字串提供了大量的庫函式讓我們使用,大大減輕了程式設計師的負擔。

我們從使用空間上來分析一下,我們知道,int型別是佔4個位元組,而char只佔1個位元組,從第1、3、5、6、7這三列的資料來看,使用char使用int能節省更多的記憶體空間。

好了,有了上面的分析,我們是不是已經猜想出了此檔案的結構了?那就定義此結構吧!

現在,讓我們開始進行檔案的操作(呵呵,核心哦!)

我們先利用fgets讀一條記錄到記憶體中,眾所周知,fgets是遇到換行結束的函式,我們利用此函式,可以方便快速的讀出檔案中的記錄,然後先把它存放到乙個字元陣列中。

然後,我們利用c標準庫中得strtok函式,分別擷取其中的每一項,並把它存放到結構體陣列中,至於具體怎麼做,我想大家都比較了,在此就不做敘述了。

最後是,我們把檔案中的資料都取出了,並且正確的存放到了結構體陣列中了,現在開始進行排序了,我們先按第二列進行排,如果相同的話按第七列進行排序,如果第七列也相同,那就按第五列進行排序。既然,我們取出的都是字串,那麼,我們完全可以把第

二、七、五列的字串連線到一起,然後呼叫c標準庫中的strcmp函式來進行比較大小,((*^__^*) 嘻嘻……,知道我為什麼會把上面的資料解析成字串了吧!),現在我們只需要將連線好的新字串進行比較,把結果返回給堆排中得建堆的過程中去,一些ok,聽了我的描述,你是不是感覺這個排序過程比較簡單呢?那就趕快試一試吧!

Marvell交換機開發資料收集

1.spi flash相關 2 w25q256學習 ye wei yang的專欄 csdn部落格 3 spi詳解及spi介面flash舉例 u010246947的專欄 csdn部落格 4 spi flash時序描述及驅動程式設計 strongerhuang 5 s3c2440 linux驅動移植 s...

交換機是如何對資料報打標籤去標籤的 交換機工作原理

交換機工作原理 一 基本原理 交換機有很多種類,按照其處理包的層次可以分為二層交換機,三層交換機,四層交換機和高層交換機。這些種類後面的依次比前面的增加了處理層數,具體層數從其命名也可以看出來。那麼下面就從最簡單的二層交換開始,逐層揭開交換機內部工作原理的秘密。二層交換中,交換機按照mac位址實現端...

大資料處理系統

大資料處理系統可以分為批式 batch 大資料和流式 streaming 大資料兩類。其中,批式大資料又被稱為歷史大資料,流式大資料又被稱為實時大資料。目前主流的三大分布式計算系統hadoop storm spark被廣泛運用於大資料領域。批處理大資料系統代表 hadoop 注 這類系統雖然可對完整...