一台電腦要向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台:

單向傳輸條件下,答案是輪子哥的那個,

其所需時間寫成數學公式是:

S*[(log_2n)+1]*t

雙向傳輸條件下,答案應該是

S*[log_2(n-sqrt{2n+0.25}+0.5)+1]*t

============

詳細過程待我慢慢寫……


初始電腦是不是也只能一次傳一個電腦呢?

傳輸是不是全雙工的呢,也就是接收的時候可以發送。

如果都是的話,就簡單了。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次方問題。。。


搭建個消息伺服器,採用廣播形式,半年內傳完!


推薦閱讀:

TAG:演算法 | 演算法與數據結構 | 數據傳輸 |