一台電腦要向n台電腦傳文件,假設傳輸50G給他們,n台電腦可以相互傳輸,一次只能向一台電腦傳,怎麼做?
一台電腦要向n台電腦傳輸文件,假設傳輸50G給他們(每台電腦都要得到這50G的文件),其中n台電腦之間可以相互傳輸,且每台一次只能向一台電腦傳輸,怎麼做才能更快?
應該是把50G分組,然後分;另外是不是電腦0先向1發一組,再向2發一組……,然後同時電腦1-n他們相互傳,具體是怎麼個相互傳更快啊?好像沒大家想的那麼簡單
在考慮可以將文件分包傳輸的情況下指數式的傳播顯然不是最快的。
假設傳輸 50G 數據的耗時為 t,那指數式傳播的耗時為 t log(n + 1)。假設我們將數據分成 m 個包,當 0 傳給 1 一個包後,0 向 1 繼續發包,同時 1 將第一個包傳給 2,以此類推,此時的耗時為 t + nt/m。
在 t 和 n 一定的情況下,m 趨近於正無窮時總耗時趨近於 t。問題到這裡已經結束了,其實還有更快的趨近方法,但是考慮到總的傳輸時間不可能小於 t,所以最短耗時可以無限趨近於 t。其實問題思路很簡單。分的包越多,單個包越小,其他機器就可以越早參與到分發過程,總耗時就越短。這明明是個數學問題,被好多人當網路應用問題答了。時間和速度的條件和標準沒有講清楚,暫且認為是所有電腦間傳輸單位數據花費的時間相等,且轉換目標、切換數據等不需要任何時間的理想情況。
假設兩台電腦間傳輸1byte數據所花時間為1.首先尋找理論下限:
所有數據從結點1傳出就需要50G單位的時間。而最後1byte數據在從結點1流出後還需要5個單位時間(50G時刻後有最多有兩個結點擁有最後一byte,2-&>4-&>8-&>16-&>32-&>50一共需要5個單位時間)。所以50G+5是此種情況下的理論下限了。
一台一台流水線傳的話下限是50G+48,顯然不是最優。BTW,如果再細分到bit單位的話,算下來應該是(400G+5)/8 = 50G+0.625。至
於能不能做到這個理論下限,我覺得是可能的。整個數據網路一共需要傳輸50G*49的數據,而理論下限是50G,所以每秒只需要傳輸49單位的數據。但是
規劃合理的話大部分時間都能做到50單位數據的傳輸,所以達到下限應該問題不大。即便達不到,也只會多1、2個單位的時間。
如果是單向傳播的話,最快的方法就是:1-&>2, (1,2)-&>(3,4), (1,2,3,4)-&>(5,6,7,8), ...
你的路由器已經下線
假設,每GB數據傳送需要時間1秒,兩電腦間兩兩互傳是在不同數據傳輸通道,僅以單通道傳輸數據計算時間。方案一原始電腦50G數據分成2個25G文件編號1-2,然後三台電腦ABC,第一步向A電腦傳輸文件1,第二步向B電腦傳輸文件2,同時A電腦向C電腦傳輸文件1,第三步A電腦與B電腦互傳自己沒有的文件,原始電腦向C電腦傳輸文件2。此時有四台電腦擁有完整數據所用時間75秒餘下電腦依次類推,每台電腦數據傳完三台電腦的時間均為75秒。方案二採用1變2,2變4原始電腦向A電腦傳輸數據需要時間50秒,原始電腦向B電腦,A電腦向C電腦,需要時間50秒此時有四台電腦擁有完整數據所用時間為50+50=100秒方案一時間少於方案二,猜測數據越細分,所用時間越短。
假設條件題目中未給出,如此條件不被承認,則需進一步補充題目限制。
假設數據為S比特,傳輸1比特所需時間為t,電腦有n台:
在單向傳輸條件下,答案是輪子哥的那個,其所需時間寫成數學公式是:在雙向傳輸條件下,答案應該是:============詳細過程待我慢慢寫……初始電腦是不是也只能一次傳一個電腦呢?
傳輸是不是全雙工的呢,也就是接收的時候可以發送。
如果都是的話,就簡單了。1傳輸給2,2一方面接收來自1的數據一方面傳輸給3,以此類推。總時間只比傳輸一次多一丁點。如果接收時不可發送,如果文件可分割,也不是級數增長最優。如果分成50塊,每塊需要1秒,A需向BCD傳輸。比如A向B傳塊1花費1秒。然後A向C傳遞塊2,B向D傳遞塊1,花費1秒。之後先考慮簡單的情況,A向B傳輸剩餘49塊,C與D互傳各自1塊,花費49秒。此時AB完整了,CD各有2塊,AB分別將剩餘的48塊傳給CD,花費48秒。共消耗99秒。如果按照整個文件傳輸需要級數增長,共消耗100秒。第3步簡化了,只是為了說明分塊比單個文件傳輸快。
爪機無力,找時間看看能不能推導出通用的規則…你是解數學題,還是要解決具體問題。要是後者,可以說說:
要是這些台機器都在一個網關下的區域網下,最快的方式是組播。
因為根據區域網原理,即使是一對一發送,發送的數據包都會廣播,目標機器判斷不是自己的就會丟棄;既然發都發了,帶寬也佔了,那麼這種情況下,讓這些目標機器不丟棄這些數據就是最高效的方式。
組播,也叫多播(Multicast),用的是一類特殊的IP地址,D類地址(平時常用的是A~C類),它本身不代表一台機器,而是代表多台。
組播地址_百度百科你只要把這些台機器上都安裝上組播客戶端,一台機器安裝上組播發送伺服器,往D類組播地址上發送就可以了,這樣區域網內的所有客戶端都會接受到數據。自己開發個小程序好了,協議就基於UDP,加上簡單的差錯控制和順序控制。
我曾用Java開發過這樣的程序,當時是為了實驗室安裝大型軟體,當時考慮支持組播的還有Ghost Cast這個軟體(Ghost的一個衍生組播版本),但它是針對分區的操作,顯然不合適。
還寫了篇論文,你可以參考:
基於多播的乙太網文件傳送協議的設計與實現 Design and implementation of multicast-based ethernet file transfer protocol
我大概測試了一下,單台機器接收的速度略低於FTP,40台機器的實驗室,傳VMWare的虛擬機4~5G大概只用了一個多小時,機器更多優勢應該更明顯。
有一些計算機實驗室用的管理軟體,比如紅蜘蛛也集成了這類功能,其原理也大致如此。電子教室軟體比較這問題感覺像小學奧數題穿了數據傳輸的皮啊,太長,太饒,懶得看~
上傳到網上然後大家自己下載。
一個負責協調的伺服器,維護有文件的和沒文件的兩個隊列,然後將兩個隊列頂最前面的一對一配對,開始傳
有文件的給沒文件的傳完就回到有文件的隊列中,傳完後之前沒文件的也會變成有文件的進入有文件的隊列。
簡單的說就有文件的都別閑著。傳就對了。就這樣吧。
我就不假設每次傳的速度都一樣了,因為不可能一樣。理想環境的話,50台機器看成一個流水線N員工 ,數據以一塊一塊搬運,1-&>2-&>3-&>4...-&>N,除了流水線開始和結束的時候,每個員工都在忙碌中。但是現實世界不理想,其中可能有一個會宕機,或者有的傳輸速度快,有的慢。
感覺跟數據結構關係不大啊
傳輸速率 總速率 是否可以變下載變上傳 文件能否分割 分割速率 都沒說清楚如果可以分割,我的想法是先傳很小的一部分給每一台電腦,然後所有電腦都可以工作起來互相傳輸。這很小的一部分的傳播應該是指數增加的。不過因為小在實際中影響不大,所以沒必要糾結。數學問題的話我無能為力… 太費腦了限定里,沒有限制同時接受和發送吧,那就串聯起來,1-2傳完了,幾個延時之後,就都傳完了
其實這個用Connect2就可以解決了,不用算,試一下就知道了,省得時間和力氣大力去啦!
很簡單的幾何級數增長吧,先傳給一台,兩台同時傳兩台,四台傳四台。。。。。。。。。在不連外網的情況下,沒有更快的了,話說怎麼會有這種情況發生,網路共享做個FTP都不行嗎
題主是木有聽說過組播啊!http://baike.baidu.com/view/492256.htm網路狗們早就在十幾年前就想到並且提出了這麼高效的方案了。
應該是第一台給第二台傳,然後第二台和第一台同時分別給第三台和第四台傳,然後blablabla,以此類推,貌似還是個2的n次方問題。。。
搭建個消息伺服器,採用廣播形式,半年內傳完!
推薦閱讀: