PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

  回應
 
主題工具
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Question

引用:
作者darkangel
一般 i++ loop 的時間複雜度是 O(n),而像這種迴圈最大值很小(<100)的狀況下通常會比用倍數迴圈的 O(log n) 快。

另外,不應該在這裡考慮效能問題,瓶頸不太可能會出現在這。

以我n年的實務經驗,我覺得設計時有兩個重點,分享一下:

1. 不要過度設計
2. 不要在設計時考慮效能問題,不然容易失去重點

我不熟 java,不然我給的答案應該也是 loop + if/else。

我是這樣的意思..
double[] a = { 6.5, 9, 6.5, 9.5, 6.5, 6.5, 0,
6.5, 6.5, 6.5, 6, 9.5, 6.5, 0,
6.5, 9, 6.5, 6, 6.5, 0, 6.5,
6.5, 6.5, 6.5, 6.5, 6.5, 0, 6.5,
0, 0, 0 };

int len = a.Length;
int t = 7;
for (int i = 1; t <= len; )
{

var val = a[t - 1];
if (val == 0)
Console.WriteLine("第{0}天 : 假日", t);
// end if
i++;
t *= i;
} // end if
顯然迴圈是大幅降低..
不過如果摟主的條件是假日非固定性了..
那將需要另外再評估...
     
      
舊 2016-12-26, 02:41 AM #11
回應時引用此文章
vxr離線中  
mor8
Major Member
 

加入日期: Aug 2005
文章: 237
引用:
作者classspeed
int flag = 1;
for(int i = 0; i < 30; i++, flag++){
 if(array[n] == 0){
  flag = 0;
 }
 if(flag > 6){
 System.out.println("第" + (n+1) + "天不符合");
 }
}

謝謝您的程式,把n改成i後就可以執行了。
只是我看不懂您的程式logic,方便解說說,感恩!
 
舊 2016-12-26, 08:55 AM #12
回應時引用此文章
mor8離線中  
classspeed
Regular Member
 

加入日期: Feb 2005
文章: 71
抱歉哦,睡前迷迷糊糊的。
array裡的index打錯,index最大也打錯。

陣列[]裡應該是 i 不是 n
列印那行裡面的也是 i 不是 n
for裡應該改成 i < 31或是直接用 i < array.length替代,就不會有30天或31天的問題。

沒實際跑過,有問題再上來問吧 : )
舊 2016-12-26, 08:59 AM #13
回應時引用此文章
classspeed離線中  
mor8
Major Member
 

加入日期: Aug 2005
文章: 237
引用:
作者whatsnew
以1來說笨蛋一點不就對數列做index
直接loop 31(n=1:31)次,或是根據數列長度做變化
每次loop (0+n)~(6+n),取出相對應的數列
再對這7個數字尋找0出現次數
0次的話就輸出date(n)~date(6+n) 相對應的日期
我應該沒誤會樓主的意思吧@@

對的!
沒錯。



引用:
作者vxr
如果條件一的問題..
我的想法是這樣...
我猜你的問題是抽出來看是否符合7休一天的條件...
假設你休的日子是固定的
比方說修星期日=7..
迴圈用餘數去算然後抽出來檢查..
但是我覺得這方法不好..
因為迴圈次數大...
可以的話用倍數去算...
迴圈次數將會大幅減少...
否則你要慢慢loop到31次嗎?...

....

謝謝您的回答。我真的只懂用Loop的來解決。
太難的,真的不會。


引用:
作者darkangel
以我n年的實務經驗,我覺得設計時有兩個重點,分享一下:

1. 不要過度設計
2. 不要在設計時考慮效能問題,不然容易失去重點

我不熟 java,不然我給的答案應該也是 loop + if/else。


謝謝您!
loop + if/else,我才看得懂。
舊 2016-12-26, 09:03 AM #14
回應時引用此文章
mor8離線中  
mor8
Major Member
 

加入日期: Aug 2005
文章: 237
引用:
作者classspeed
抱歉哦,睡前迷迷糊糊的。
array裡的index打錯,index最大也打錯。

陣列[]裡應該是 i 不是 n
列印那行裡面的也是 i 不是 n
for裡應該改成 i < 31或是直接用 i < array.length替代,就不會有30天或31天的問題。

沒實際跑過,有問題再上來問吧 : )

謝謝您!
方便解說,您這個程式的logic嗎?小弟看不太懂。
舊 2016-12-26, 09:10 AM #15
回應時引用此文章
mor8離線中  
mor8
Major Member
 

加入日期: Aug 2005
文章: 237
引用:
作者vxr
我是這樣的意思..
double[] a = { 6.5, 9, 6.5, 9.5, 6.5, 6.5, 0,
6.5, 6.5, 6.5, 6, 9.5, 6.5, 0,
6.5, 9, 6.5, 6, 6.5, 0, 6.5,
6.5, 6.5, 6.5, 6.5, 6.5, 0, 6.5,
0, 0, 0 };

int len = a.Length;
int t = 7;
for (int i = 1; t <= len; )
{

var val = a[t - 1];
if (val == 0)
Console.WriteLine("第{0}天 : 假日", t);
// end if
i++;
t *= i;
} // end if
顯然迴圈是大幅降低..
不過如果摟主的條件是假日非固定性了..
那將需要另外再評估...

7休1。規定就是每7天一定要放一天。那天不一定是星期日。
舊 2016-12-26, 09:13 AM #16
回應時引用此文章
mor8離線中  
classspeed
Regular Member
 

加入日期: Feb 2005
文章: 71
引用:
作者mor8
謝謝您的程式,把n改成i後就可以執行了。
只是我看不懂您的程式logic,方便解說說,感恩!



int flag = 1; //計算你上班天數,從第一天開始算
for(int i = 0; i < array.length; i++, flag++){ //array.length就是你休假陣列長度,每走一圈,flag上班天數+1
 if(array[i] == 0){ //當天上班時數為零,上班天數flag就會歸零
  flag = 0;
 }
 if(flag > 6){ //上班天第七天就會顯示當天不符合規定,並列印
 System.out.println("第" + (i+1) + "天不符合"); //[]初始從0開始算,轉成實際天數要+1
 }
}

此文章於 2016-12-26 09:22 AM 被 classspeed 編輯.
舊 2016-12-26, 09:14 AM #17
回應時引用此文章
classspeed離線中  
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

引用:
作者mor8
7休1。規定就是每7天一定要放一天。那天不一定是星期日。

那我建議你以一個星期(7天)為一個單位..
作為第一層loop
而且以倍數性增長
7, 14, 21, 28這樣..
然後放入一個inner loop...
1-7
8-14
15-21
依此類推
只要抽出檢查發現有一天有假日就符合用break跳出inner loop...
不要乖乖真的跑loop到31次..
那不是一個好作法..
最簡單的理由就是有可能每一次的inner loop都跑完嗎?...
如果每次都跑完, 這甚麼鳥公司啊...
這出勤已經不是可以用血汗來形容了.......
違反勞基法, 要向勞檢單位檢舉......
你要適切的符合真實世界情況...

好吧!.. 有人會覺得我機車...
小弟就是不想跑完那31次loop拉..>o<""

當你掌握了這樣的算法..
你再增加一個類似event_args之類的物件, 目的類似context..
要用他做紀錄..
為的就是要快速計算你後面的三個條件...

此文章於 2016-12-26 09:36 AM 被 vxr 編輯.
舊 2016-12-26, 09:30 AM #18
回應時引用此文章
vxr離線中  
mor8
Major Member
 

加入日期: Aug 2005
文章: 237
引用:
作者classspeed
int flag = 1; //計算你上班天數,從第一天開始算
for(int i = 0; i < array.length; i++, flag++){ //array.length就是你休假陣列長度,每走一圈,flag上班天數+1
 if(array[i] == 0){ //當天上班時數為零,上班天數flag就會歸零
  flag = 0;
 }
 if(flag > 6){ //上班天第七天就會顯示當天不符合規定,並列印
 System.out.println("第" + (i+1) + "天不符合"); //[]初始從0開始算,轉成實際天數要+1
 }
}



太感謝了!
舊 2016-12-26, 09:38 AM #19
回應時引用此文章
mor8離線中  
mor8
Major Member
 

加入日期: Aug 2005
文章: 237
引用:
作者vxr
那我建議你以一個星期(7天)為一個單位..
作為第一層loop
而且以倍數性增長
7, 14, 21, 28這樣..
然後放入一個inner loop...
1-7
8-14
15-21
依此類推
只要抽出檢查發現有一天有假日就符合用break跳出inner loop...
不要乖乖真的跑loop到31次..
那不是一個好作法..
最簡單的理由就是有可能每一次的inner loop都跑完嗎?...
如果每次都跑完, 這甚麼鳥公司啊...
這出勤已經不是可以用血汗來形容了.......
違反勞基法, 要向勞檢單位檢舉......
你要適切的符合真實世界情況...

好吧!.. 有人會覺得我機車...
小弟就是不想跑完那31次loop拉..>o<""

當你掌握了這樣的算法..
你再增加一個類似event_args之類的物件, 目的類似context..
要用他做紀錄..
為的就是要快速計算你後面的三個條件...

謝謝您!
您的方法對我而言,真的是太難了。
舊 2016-12-26, 09:43 AM #20
回應時引用此文章
mor8離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是06:26 AM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。