一、過濾器模式Pro簡介
前已經寫過過濾器模式,這里再寫一篇有以下幾個方面原因:
1、前一章的算法、數據和數據規則沒有分離,這里設計一個可用的工具包;
2、C#里面有統一查詢語言(LINQ),里面包含數據查詢、集合查詢、以及排序,這篇文章也來開發一個LabVIEW的統一查詢工具包,實現以上功能。
功能包含以上內容:
1、數據查詢;
2、集合運算:交集、并集;
3、數據排序:升序和降序;
以上功能可以任意組合。
二、過濾器模式Pro-過濾
下圖為我們設計的UML關系類圖:
1、Abstract Filter過濾器框架:定義了過濾器過濾的基本規則
2、Abstract Data需要查詢的數據類型:只定義的一個tostring用于顯示數據
3、Abstract Rule定義了具體數據規則
下面開始編程
1、創建一個工程命名為LLINQ,意思是LabVIEW的LINQ。
2、創建3個類分別命名為Abstract Filter、Abstract Data和Abstract Rule,在Abstract Filter私有數據中添加Abstract Rule和Abstract Data數組;并創建其數據成員訪問。
3、在Abstract Rule的私有數據數據中添加兩個Abstract Data分別命名為RData1、RData2,并創建其數據成員訪問。
5、在Abstract Rule中創建一個動態VI命名為Filter rule。
6、在Abstract Filter中添加靜態類DoFilter,這個規則比較簡單,只要是符合規則就留下,不符合規則就剔除。
下邊寫個實際DEMO來演示下過濾模式
6.1、創建VI命名為Filer DEMO
6.2、創建一個類命名為Double data繼承至Abstract Data,在私有數據添加一個double類型數據。
6.3、創建一個類命名為Greate The 0.5繼承至Abstract rule,重寫Filer rule。
6.4、在AbstratFIler中添加數據和過濾規則,進行過濾,然后再取出數據
三、過濾器模式Pro-集合運算
1、并集
在Abstract Filter中創建靜態方法Uniton,做法分三步
1.1、設置兩個過濾器作為輸入;
1.2、找出結合2中與集合1相同的部分并剔除;
1.3、合并剔除后的集合數據并保存到結果數據中。
2、交集
在Abstract Filter中創建靜態方法Intersection,做法分兩步
2.1、設置兩個過濾器作為輸入;
2.2、取出結合2中與集合1相同的部分,保存到輸出結果中。
2、集合范例
下面是一個兩個數組,一個是0--9的整數,一個是5--14的整數,求他們的交集和并集。
先創建一個整類繼承至Abstract Rule,私有數據類型為整型,重寫數據規則Filer Rule:
3、下面是具體的使用代碼:
4、前面板結果
四、過濾器模式Pro-冒泡排序
數組排序是一個經常使用的功能,LabVIEW自帶的數組排序功能只能對數值類型數據進行排序,那么簇,指定類中特定數據排序呢,每次都需要自己寫非常麻煩,影響編程效率。下面寫個通用的冒泡排序算法:
從最底部兩個元素開始比價,如果上一個元素大于下一個元素就交換位置,然后向上挪一個位置,重復以上操作直到最頂端。最大值就像泡泡浮出水面一樣,再從最底端到頂端第二個元素重復上面動作,依次循環
這個是冒泡迭代的位置。
具體編碼如下程序框圖:
建一個double比較的數據規則
創建個DEMO生成一組隨機數看看運行結果:
運行下結果達到預期,我們把數據數量改成1000,2000看看運行時間
上面可以看到1000次運行時間為3.39秒,2000次運行時間為13.7秒,這個時間感覺太長了,能優化排序算法將時間縮短不?
看下一章的分治排序法。
五、過濾器模式Pro-分治排序
冒泡排序算法的時間復雜度為O(n^2)空間復雜度為O(1)
我們使用分治排序時間復雜度為O(nlog(n))空間復雜度為O(log(n))
簡單介紹下原理:
固定第一個數,從最后和最前搜索,當后面大于第一個數,前面小于第一個數時就交換搜到的數據。當兩個搜索指針相遇時,就交換第固定數和相遇數。交換后結果為:相遇位置數左邊數小,比右邊的數大。
將其按照相遇位置前后分成兩組:分別重復上面內容直到分治完成。
下邊開始編寫分治算法代碼,圖中有需要調用相同的算法需要用到遞歸,我們把主體算法和遞歸部分分離,創建一個VI命名為Devide Core,VI屬性設置如下:
分治核心代碼
測試后1000次時間為0.58秒,2000次時間為2.20秒,比冒泡排序有了很大的改善,那么有沒有更快的優化方案呢?看下邊異步分治排序法。
五、過濾器模式Pro-異步分治排序
如上圖所示,我們第一次分組后,組一執行完后再執行組二,組一和組二的數據互不干擾,那么我們將異步執行組一和組二,以空間換時間。
具體代碼改造如下:
1、將數據轉換為引用類型;
2、將組一和組二異步執行。
具體代碼如下:
異步分治排序算法:
異步分治核心:
測試代碼:
有上面例子可以看出,使用異步分治排序算法,排序速度有了指數級別提升。
審核編輯:郭婷
-
LabVIEW
+關注
關注
1964文章
3652瀏覽量
322563 -
過濾器
+關注
關注
1文章
427瀏覽量
19563
原文標題:LabVIEW的編程之道—過濾器模式Por
文章出處:【微信號:LabVIEW的編程之道,微信公眾號:LabVIEW的編程之道】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論