程式碼競賽 - 找出中位數 (贈品是128MB的MP3隨身碟以及NI Day)

詳細活動請參閱: http://labview.com.tw/codingchallenge/20040601~20040731/codi ngchallenge.asp

贈品資訊請參閱: http://labview.com.tw/codingchallenge/20040601~20040731/gift .asp
(贈品由NI公司提供)

 

程式碼競賽 - 找出中位數

你的任務就是設計一個VI,從含有3,000,000(三百萬)或3,000,001個亂數element的1D Array中,快速找出「中位數」。每一個element皆為範圍介於0-1,000的雙精確數。

在統計學中,所謂的中位數就是從一序列的數字中,先依數字大小排序。假設總共有n個數,若n為奇數,則最中間那一個數就是中 位數;如果n是偶數,那麼最中間那兩個數的平均數,就是中位數。

在這場比賽中,您不能使用LabVIEW內建的Array排序程式,如Sort 1-D Array.viSort 1-D Array PtByPt.viSort Complex Numbers.vi ...等等。如果您想要將Array排序,您必須自己寫排序的程式。您也不可以使用LabVIEW內建的求中位數程式,如Median.viMedian PtByPt.viMedian Filter.viMedian Filter PtByPt.vi...等。

下面是一個簡單的解說。如果有一個Array是 <1, 3, 0>,我們要先將他排序成<0, 1, 3>,由於這個Array裡面有3個element,所以中位數就是最中間的那一個數,以此例來說,中位數是「1」。另一 個例子,如果有一個Array是<3, 8, 4, 0, 14, 6>,那我們要先將他排序成<0, 3, 4, 6, 8, 14>,由於這個Array裡面的element是偶數,所以中位數就是最中間那兩個數「4,6」的平均數,因此,中位數 是「 5」。


評分的標準:

  1. 正確性
  2. 執行速度
  3. 程式碼的style關於程式碼的Style,您可以參考:養成良好的程式撰寫習慣三部曲

提示:

  1. 由於您不能使用LabVIEW內建的演算法,所以建議您先到網路上,找尋中位數的驗算法,通常那會是一個好的開始
  2. 使用我們提供的開始VI(codingchallenge.zip),作為美好的開始吧。

這個競賽的特別規定:

  1. 所有的程式碼都要使用LabVIEW。
  2. 不可使用外部的程式碼,如DLLs、CINs、exes... 等等。
  3. 不可以使用LabVIEW內建的排序工具,如Sort 1-D Array.vi、Sort 1-D Array PtByPt.vi、Sort Complex Numbers.vi...等。 也不可以使用LabVIEW內建的中位數VI,如Median.vi、Median PtByPt.vi、Median Filter.vi、Median Filter PtByPt.vi...等。
  4. 請帶著愉快的心情參加這個競賽!

支援:

  1. 如果您對我們舉辦的活動有任何意見,請到「Coding Challenge 程式碼競賽」張貼您的意見與建議。
  2. 如果想要討論這一次Coding Challenge的技術問題,請到http://labview.com.tw/forum/forum_topics.asp?FID=23,提出問題,參與討論。

繳交程式G

  • 上傳檔案的檔名,為下列四種之ㄧ:vi, llb, zip, rar,不可以上傳副檔名為exe的檔案
  • 請將您的程式,寄到:[email protected]。郵寄時′偏怴A2004/7/31晚上12:00截止收件
Benjamin38169.7556018519

哇,有比賽耶,不知道Ben老大是否要下海,雖然現在很多事要做,不過有時間我也來試看看

歡迎歡迎...不過還是論文要緊唷...你是今年畢業吧...加油!![](upload://2nH684ZLCahhPzS2i2gQOg53lJz.gif)

Function>>Array都不能用嗎?

如:Array Index.Build Array.Insert into Array...等嗎

說明,除了下面的VI不可以使用之外,其他的LabVIEW內建的VI都可以使用:

![](upload://ijYN3H6rftM0uT5dAq1NiOGBlZR.jpeg):Sort 1-D Array.vi

![](upload://6RiXkLTR8MQTukEYYkBVpqmainX.jpeg):Sort 1-D Array PtByPt.vi

![](upload://bFGDhKYgQYSBgCMeTuArEIDzuoV.jpeg):Sort Complex Numbers.vi

![](upload://cHcsvsTsmJH0k6Isc5RXow9PDMk.jpeg):Median.vi

![](upload://8YEPVLgc880ZOXKbC8swG2nrcLK.jpeg):Median PtByPt.vi

![](upload://6XTZqqFI72DpBbPLI0ggiSaBYR8.jpeg):Median Filter.vi

![](upload://rPVgxo3YcZeFLc3D19qTbdemkGt.jpeg):Median Filter PtByPt.vi

請大家來參加這個競賽吧...有很大的機會可以獲獎唷...

請問Benjamin要怎麼測執行速度 ?

另外,如果用formula structure,裡面的code是C,這樣算符合第一條規定嗎

yao38176.3788773148

不好意思有點看不懂題目,可以再解釋一下下面的意思嗎?謝謝

你的任務就是設計一個VI,從含有3,000,000(三百萬)或3,000,001個亂數element的1D Array中,快速找出「中位數」。每一個element皆為範圍介於0-1,000的雙精確數。

我知道意思了!

ancle38177.7443055556

[QUOTE=ancle]

不好意思有點看不懂題目,可以再解釋一下下面的意思嗎?謝謝

你的任務就是設計一個VI,從含有3,000,000(三百萬)或3,000,001個亂數element的1D Array中,快速找出「中位數」。每一個element皆為範圍介於0-1,000的雙精確數。

我知道意思了!

[/QUOTE]

呵呵,我還是再說明一下:

就是工程師在測你的程式的時候,有可能會用輸入3,000,000(三百萬)的亂數到你的程式,或是輸入3,000,001個亂 數到你的程式,你的程式必須要能針對奇數個input或是偶數個input做不同的判斷。

而每一個亂數,我們也定義它為「範圍介於0-1,000的雙精確數」。這樣大家在設計的時候,可以將這個因素也考慮進去。

![](upload://wh1Jr0invKZTARRL2Hqlvc8do63.gif)

剛剛自己測了一下執行時間,只能以慘不忍睹來形容,一度以為是當機了,可否請版主先提出最低執行時間的門檻,好讓我是否決定要寄 檔案,謝謝

[QUOTE=ancle]

剛剛自己測了一下執行時間,只能以慘不忍睹來形容,一度以為是當機了,可否請版主先提出最低執行時間的門檻,好讓我是否決定要寄 檔案,謝謝

[/QUOTE]

抱歉,我自己還沒有實際寫過這個程式,所以我不知道執行的時間是多少?不過,如果一個人寄多份程式參加比賽的話,評分的時候會選 擇最新的那個檔案來評分。

說到評分,我只有寫評分的標準,但是沒有寫評分的比重,比如說:速度佔百分之多少;寫程式的風格佔百分之多少。我下個星期PXI TAC過後,會詢問NI Taiwan,我想這些規則一定要先訂定清楚,才可以讓大家有一個公開、透明的資訊。

[QUOTE=yao]

請問Benjamin要怎麼測執行速度 ?

另外,如果用formula structure,裡面的code是C,這樣算符合第一條規定嗎

[/QUOTE]

如果使用formula node,因為那也是LabVIEW的一部分,所以是可以的。可以使用formula node。

![](upload://A8hRjyN6RFY1HFOMmhNWu1yp6aD.jpeg)

 

[QUOTE=Benjamin][QUOTE=ancle]

剛剛自己測了一下執行時間,只能以慘不忍睹來形容,一度以為是當機了,可否請版主先提出最低執行時間的門檻,好讓我是否決定要寄 檔案,謝謝

[/QUOTE]

抱歉,我自己還沒有實際寫過這個程式,所以我不知道執行的時間是多少?不過,如果一個人寄多份程式參加比賽的話,評分的時候會選 擇最新的那個檔案來評分。

說到評分,我只有寫評分的標準,但是沒有寫評分的比重,比如說:速度佔百分之多少;寫程式的風格佔百分之多少。我下個星期PXI TAC過後,會詢問NI Taiwan,我想這些規則一定要先訂定清楚,才可以讓大家有一個公開、透明的資訊。

[/QUOTE]

請問一下,是不是要附上程式時,是不是要連同個人資料一併附上呢?
而個人資料需要附上哪些資料呢?

 

[QUOTE=Airbolt]

[QUOTE]

請問一下,是不是要附上程式時,是不是要連同個人資料一併附上呢?
而個人資料需要附上哪些資料呢?

 

[/QUOTE]

剛剛在 開始VI(codingchallenge.zip) 裡頭的 note ,
找到了填寫個人資料的地方。

PS: 如果沒有下載這個 VI ,我想應該會跟我有相同的困惑吧?!
       因為比賽規則沒有說一定要使用這個 VI 開始 寫作。

 

Airbolt38180.6456944444

[QUOTE=Airbolt]剛剛在 開始VI(codingchallenge.zip) 裡頭的 note ,
找到了填寫個人資料的地方。

PS: 如果沒有下載這個 VI ,我想應該會跟我有相同的困惑吧?!
       因為比賽規則沒有說一定要使用這個 VI 開始 寫作。[/QUOTE]

抱歉,我馬上將您的建議補上去。![](upload://aeTYlqEc1qXvs9Jv3ju6pnq9wZt.gif)

謝謝您的建議。

     不知各位先進的寫作情形如何,有多少人有"交卷", 我自己用merge array 的方式排列就是沒法和Function的 sort 1-D array 的速度相比, sort 1-D array 大概五分鐘就排好三百萬組array, 不知是否各位先進知道為何LV 的Function 排列如此的快, 而自己寫的程式就要跑幾小時.

 

有這麼誇張嗎??

用sort 1-D arrary約250ms吧.....

我用自己寫的目前測到約120000~240000ms 之間吧...2~4分鐘吧!

3000000和3000001我目前是跑同樣的程式...希望目標可以做到一分鐘以內吧!!

電腦系統:Dell P4-2.8GHz

不好意思

我的電腦是700MHz, Ram只有128Mb

不過想請教Ronaldsmith,你有用到formula node 嗎, 因我嘗試的方式都是純粹用內部基本的Function 兜起來的(像sequence , case ,for loop及加減等), 並且是先在子陣列排列好後再併回原始陣列,因自己試了好幾種排列法,但效果並不十分顯著, 也許是電腦等級的問題, 但我想使用的function 不同也會有極大的影響.

希望這次最後得獎的作品可以讓我們網友 "瞻仰"一下, 是如何有效率的使用LV解決這類的問題.

我並沒有用到formula node啦, 我純粹是使用LV內基本的一些function都起來的, 我想應該是可以更快吧?!不過我對記憶體的配置這一塊還不夠熟悉....努力研究中囉!排列法還是有影響的喔..我也只是了兩種排列法跟一種刪去法...還是要繼續努力的想的!!

大家要一起加油囉.....我最喜歡腦力激盪囉!

 

[QUOTE=t122ab]

不好意思

我的電腦是700MHz, Ram只有128Mb

不過想請教Ronaldsmith,你有用到formula node 嗎, 因我嘗試的方式都是純粹用內部基本的Function 兜起來的(像sequence , case ,for loop及加減等), 並且是先在子陣列排列好後再併回原始陣列,因自己試了好幾種排列法,但效果並不十分顯著, 也許是電腦等級的問題, 但我想使用的function 不同也會有極大的影響.

希望這次最後得獎的作品可以讓我們網友 "瞻仰"一下, 是如何有效率的使用LV解決這類的問題.

[/QUOTE]

直接用mean.vi更快,15ms,我的電腦等級才Celeron 1.7G而已, C果然高階語言中是最快的