程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 最壞的設計 寫最合理的程序,最壞設計

最壞的設計 寫最合理的程序,最壞設計

編輯:C#入門知識

最壞的設計 寫最合理的程序,最壞設計


      我發現我最前面的socket、2pc系列的代碼式博文,沒有什麼評論和推薦,這直接導致我不再想寫一些更深入一點的代碼式博文了。還是寫寫這種亂七八糟的博文吧,這種的看起來比較受歡迎。

      拿前一段時間比較熱門的出行類app(滴滴,快的等)來舉例說明,用最壞的設計,寫最合理的程序。從另一個角度,來看程序設計。

 

      當一個乘客,設置好了路線的起點和終點,並點擊了叫車以後,服務器這個時候就需要做什麼呢?

      根據乘客的起點來進行匹配,將它的這次請求,發送給他附近的一些出租車司機。假定為方圓1km以內稱為附近的司機(因:出租車不需要像順路車一樣,需要考慮方向,暫時也不用考慮拒載),再由司機決定是否接受,並在司機接受以後,提示其他司機該乘客已上車。

      官方數據,上海市(目前僅考慮上海市場)有80k輛出租車,假定根據各方面的計算,單個線程每s需要處理的並發量,大約在100,則單次乘客的叫車請求(不考慮網絡耗時,僅考慮服務器處理),在10ms以內處理完畢即可滿足市場需求,那最壞的設計下,80k個司機全部遍歷一次,如果時間在10ms以內就能完成,那我們這樣做程序設計,就完全沒有任何問題,簡單直接,且滿足需求,這便是合理的程序設計。

 

      那麼問題來了,由於司機的所在地理位置,按120km/h(33m/s)計算,數據在一直不停變更,存放司機數據的內存,需要不停的上鎖,直接做foreach處理可能遠遠達不到我們的需要。這時候該怎麼解決呢?

      於是我們想出了第二種解決方案,把司機的數據,直接存放在rmdb,並對司機的地理位置,做非聚簇索引,80k條數據做一次單表select,這個是速度是極快極快的。但由於數據是在不斷變更的,按33m/s來計算,1km大約是33s,500m大約是16s,最壞的設計下,我們只需要測試,rmdb能夠撐住的update,在80k/16s (5k/s) 的情況下,那麼我們這樣做程序設計,也完全沒有任何問題,簡單直接,且滿足需求,這也是合理的程序。

      

      那麼問題來了,如果我們不是做出租車,而是做私家車呢?根據官方數據,上海私家車,約為140w輛,且每年以約20%的速度增長。這個時候,放在DB就遠遠滿足不了我們的需求。那怎麼辦呢?

      於是我們想出了第三種解決方案,把司機的數據,按照地理的經緯度位置分組,以每平方公裡切分成1個方格數據(上海有7000平方公裡),則約為7000個分組,則1400k/7000=200,根據乘客的起點,計算出隸屬於哪一個方塊,則我們只需要遍歷該方格,和周邊的8個方塊(參照9宮格)數據即可,200*9=1800。然後根據司機的地理位置變化,不斷的將司機從一個方格移動到另外一個方格。那最壞的設計下,單次遍歷1800個司機數據,能夠滿足我們的需求的話,那麼我們這樣做程序設計,就完全沒有任何問題,簡單直接,且滿足需求,這便是最合理的程序。如果還是慢,則可以按0.5平方公裡切分。一般到這裡,就結束了,這個設計幾乎滿足任何出行類應用app。

      說個題外話:假如數據還是很大,依然無法滿足,我們則可以繼續針對方格數據,對裡面的司機進行排序 或 區間處理等方式,繼續降低遍歷的復雜度,算法題,不在此文所陳述范疇。固不做具體描述。

      

      請注意看,我前面用的是一般到這裡,就結束了,那麼不一般的情況呢?

      這個時候高潮來了,假如司機手賤,老子就是不接客,且乘客也手賤,發現長時間沒有司機接單,老子依舊不取消叫車。並且當有司機/乘客隨著移動,進入到另外一個方格時,需要自動提示該司機,有這個乘客在叫車。注:該叫車請求沒結束之前,有地理位置變化,所產生的新的 滿足匹配需求的,以及不再滿足匹配需求的,需要推送消息,告訴司機該乘客已超出范圍 或 有新乘客叫車。

      隨著叫車請求的不斷累加,為了保證系統的正常運作,需要處理的並發數,就會不斷遞增。

      雖然這種場景不太可能發生,但是這種變態的開發需求,在一些非定點叫車的沿途類出行app裡面,經常會出現。

      那麼問題來了,當這種需求來臨時,該怎麼處理呢?

      還是老辦法,最壞的設計下,單個線程能處理的請求數,假定為1000個,則將所有的請求數,入一個隊列。當有新的請求進來時,判定該隊列裡面是否已經有1000個請求,在處理中。如果有,則該請求不處理 或是將該請求入另外一個線程的隊列 或 分發到另外一台機器。一直持續到該隊列的個數低於1000(用戶取消叫車,超時自動放棄等)。當然了,具體的處理方式可以有很多種。但總體來說,都是按最糟糕的情況,來設計程序的臨界值和處理方式。

      總體來說,一個合理的程序,一定是滿足其最壞的設計。


【高分懸賞】用C/C++語言設計一個適應算法(最先、最佳或最壞適應算法)

考的是內存的動態劃分區域內容,很好寫啊
1.可以用數字來模擬內存區域劃分情況,比如建一個100大小的數組(結構為struc (區號,值),值為0表示空閒,值為1表示占用,初始化幾個已確定占有的分區,分區一,1-5 占有,6-12 空閒,。。。。。。。,並建立空閒區域表,很簡單,從頭到尾對數組掃描下就知道了
2.最先適應:從內存開始地址找到第一個大於請求大小的連續空閒區域,如請求5個空間,那就在剛開始6-12空閒處建立分區二 ,6-11 ,占用
3.最佳適應:指所有空閒塊最適應請求大小的那塊,min(空閒塊大小-請求大小)
4.最壞:指適應請求大小,且最大的那塊空閒區域
 

運用面向對象的程序設計的思想,合理抽象一個類,並編寫程序

#include<iostream.h>
class Number
{
public:
Number(int a,int b=1):flag(1)
{
num1=a;
}
~Number()
{
cout<<"delete data!"<<endl;
}
friend void display(Number &s);
friend void modify(Number &s);
static int n;
void operator <<(Number &s);
void operator >>(Number &s);
private:
int num1;
const flag;
};
void display(Number &s)
{
cout<<s.num1<<endl<<s.flag<<endl;
}
void modify(Number &s)
{
cout<<"ÊäÈëÊý¾Ý"<<endl;
cin>>s.num1;
}
void Number::operator <<(Number &s)
{
display(s);
}
void Number::operator >>(Number &s)
{
modify(s);
}
int Number::n=100;
void main()
{
Number n1(12),n2(13);
display(n1);
n1>>n1;
n1<<n1;
cout<<"show static member!"<<endl;
cout<<Number::n<<endl;
}
包含了你要的知識點,可能裡面的變量意義,好像沒有多大關系,主要是功能是實現,私有成員友元接口,等等,自己可以看看,能力有限,就寫這麼多吧,呵呵,不懂可以給我留言呀!呵呵
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved