2017-02-15 31 views
1

我不理解這個問題,我的意思是我想知道這個問題的樣本輸入輸出,問題是:「鴿子的原理規定,如果一個函數f有n個不同的輸入但小於n個不同的輸出,則存在兩個輸入a和b,使得a = b和f(a)= f(b)。給出一個算法來找到a和b,使得f(a)= f(b)該函數輸入是1,2,......,和n?Pigeonhole原理(離散數學)

我無法解決,因爲我不認清這個問題這個問題。 尋求你的幫助。

+2

此網站是用於編程問答。你會有更好的運氣http://math.stackexchange.com/ – Aaron

+1

@Aaron算法是編程/ CS,而不是數學。 – RBarryYoung

+1

@RBarryYoung離散數學和CS之間的界限可以是模糊的,不管這個問題可能屬於http://cs.stackexchange.com/或http://math.stackexchange.com/ –

回答

0

繼續什麼https://stackoverflow.com/a/42254627/7256243說。 可以說y將長度爲N的數組A映射到長度爲N-1的數組B. 比結果可能是一個數組B;爲1索引你會有2個元素。

A = {1,2,3,4,5,6} 
map A -> B 

可能的解決方案可能是。

B= {1,2,{3,4},5,6} 

A - >的映射可以通過多種方式完成。 這裏在這個例子中,數組A中的3和4的輸入索引在數組B中具有相同的索引。

我希望這個有用。

+0

對不起親愛的,你在談論哈希? map a和b的含義是什麼?我還沒有學過散列,我正在尋求解決方案和樣本輸入輸出這個問題,我想在c中使用天真的方法來實現,我希望你能幫助我這個! –

0

那我們一步一步來吧。

我有2個盒子。我的父親給了我3塊巧克力....

我想把這些巧克力放在2盒。爲了我們的利益,我們來命名巧克力a,b,c

那麼我們可以將它們放入多少種方式?

[ab][c] 
[abc][] 
[a][bc] 

你看到一些奇怪的東西?至少有一個盒子含有1個以上的巧克力。

那麼你怎麼看?

你可以嘗試任何數量的盒子和巧克力(超過盒子數量),試試這個。你會看到它是正確的。

好吧,讓我們更容易:

我有5個朋友3個房間。我們正在舉辦派對。現在讓我們看看會發生什麼。 (我所有的朋友都會坐在房間裏的任何一個)

我聲稱至少有一個房間會有超過1個朋友。

我的朋友們相當混亂,知道他們試圖證明我錯了。

  • 朋友-1選擇房間1。
  • 朋友2認爲爲什麼房間1?然後,我會是正確的,所以他選擇房間2
  • 朋友3也認爲相同...他避開1和2房間,並進入房間3
  • 朋友4現在來了,他明白,沒有其他空房間,所以他不得不進入一些房間。因此我變得正確。

那麼你瞭解情況?

有n個朋友(功能),但不幸或(幸運的是)他們的房間(輸出值)小於n。所以ofcourse的一個存在2朋友礦井ab誰共享同一個房間。(同值f(a)=f(b)

+0

嗯我清楚理論現在謝謝你,但有沒有辦法解決它沒有散列?給出樣本輸入輸出也將是有益的。謝謝 –

+0

@MobassirHossen .:如果答案幫助你請upvote ..謝謝。 – coderredoc

1

鴿巢原理說,如果你有超過箱子更多的項目,盒子中的至少一個必須有其中有多個項目。

如果您想要查找!= b具有屬性f(a)== f(b)的項目,直接的方法是使用散列映射數據結構。使用函數值f(x)作爲鍵來存儲項目值x。迭代項目,x = 1,...,n。如果在f(x)處沒有條目,則存儲x。如果存在,則x的當前值和f(x)中存儲的值是您正在尋找的一對類型。

僞代碼:

h = {} # initialize an empty hashmap 
for x in 1,...,n 
    if h[f(x)] is empty 
     h[f(x)] <- x # store x in the hashmap indexed by f(x) 
    else 
     (x, h[f(x)]) qualify as a match # do what you want with them 

如果你想找出所有鴿子誰擁有室友,初始化與空套HashMap中。然後遍歷這些值並將當前值x附加到由f(x)索引的集合中。最後,遍歷hashmap並挑選出所有具有多個元素的集合。


既然你沒有指定一個語言,它的樂趣,我決定在Ruby中實現後者的算法:

N = 10 # number of pigeons 

# Create an array of value/function pairs. 
# Using N-1 for range of rand guarantees at least one duplicate random 
# number, and with the nature of randomness, quite likely more. 
value_and_f = Array.new(N) { |index| [index, rand(N-1)]} 

h = {} # new hash 

puts "Value/function pairs..." 
p value_and_f # print the value/function pairs 

value_and_f.each do |x, key| 
    h[key] = [] unless h[key] # create an array if none exists for this key 
    h[key] << x    # append the x to the array associated with this key 
end 

puts "\nConfirm which values share function mapping" 
h.keys.each { |key| p h[key] if h[key].length > 1 } 

將會產生以下的輸出,例如:

Value/function pairs... 
[[0, 0], [1, 3], [2, 1], [3, 6], [4, 7], [5, 4], [6, 0], [7, 1], [8, 0], [9, 3]] 

Confirm which values share function mapping 
[0, 6, 8] 
[1, 9] 
[2, 7] 

由於此實現使用隨機性,因此每次運行它時都會產生不同的結果。

+0

我非常抱歉,我應該指定language.i工作在c.i更喜歡c代碼,你能給我一個簡單的算法來做c嗎?我還沒有學過哈希,我不知道是否有任何其他簡單的方法來實現這個問題在C語言,謝謝 –

+0

你可以用一個數組的數組替換散列,因爲你使用的是整數值。但是,我不會爲你寫。你問了一個算法,我用僞代碼給了你一個算法,並且證明它確實有效。您必須成爲將其翻譯成您想要工作的語言的人。 – pjs

+0

聲明您希望實現C,並且希望避免散列的解決方案可以改變您的問題。這是在StackOverflow上皺起了眉頭。相反,您應該將更受限制的版本作爲另一個問題發佈。但請注意,你很可能讓人們低估你,並告訴你這不是一個代碼寫作服務。 – pjs