我不理解這個問題,我的意思是我想知道這個問題的樣本輸入輸出,問題是:「鴿子的原理規定,如果一個函數f有n個不同的輸入但小於n個不同的輸出,則存在兩個輸入a和b,使得a = b和f(a)= f(b)。給出一個算法來找到a和b,使得f(a)= f(b)該函數輸入是1,2,......,和n?Pigeonhole原理(離散數學)
我無法解決,因爲我不認清這個問題這個問題。 尋求你的幫助。
我不理解這個問題,我的意思是我想知道這個問題的樣本輸入輸出,問題是:「鴿子的原理規定,如果一個函數f有n個不同的輸入但小於n個不同的輸出,則存在兩個輸入a和b,使得a = b和f(a)= f(b)。給出一個算法來找到a和b,使得f(a)= f(b)該函數輸入是1,2,......,和n?Pigeonhole原理(離散數學)
我無法解決,因爲我不認清這個問題這個問題。 尋求你的幫助。
繼續什麼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中具有相同的索引。
我希望這個有用。
對不起親愛的,你在談論哈希? map a和b的含義是什麼?我還沒有學過散列,我正在尋求解決方案和樣本輸入輸出這個問題,我想在c中使用天真的方法來實現,我希望你能幫助我這個! –
那我們一步一步來吧。
我想把這些巧克力放在2盒。爲了我們的利益,我們來命名巧克力a
,b
,c
。
那麼我們可以將它們放入多少種方式?
[ab][c]
[abc][]
[a][bc]
你看到一些奇怪的東西?至少有一個盒子含有1個以上的巧克力。
那麼你怎麼看?
你可以嘗試任何數量的盒子和巧克力(超過盒子數量),試試這個。你會看到它是正確的。
我有5個朋友3個房間。我們正在舉辦派對。現在讓我們看看會發生什麼。 (我所有的朋友都會坐在房間裏的任何一個)
我聲稱至少有一個房間會有超過1個朋友。
我的朋友們相當混亂,知道他們試圖證明我錯了。
那麼你瞭解情況?
有n個朋友(功能),但不幸或(幸運的是)他們的房間(輸出值)小於n。所以ofcourse的一個存在2朋友礦井a
和b
誰共享同一個房間。(同值f(a)=f(b)
)
嗯我清楚理論現在謝謝你,但有沒有辦法解決它沒有散列?給出樣本輸入輸出也將是有益的。謝謝 –
@MobassirHossen .:如果答案幫助你請upvote ..謝謝。 – coderredoc
鴿巢原理說,如果你有超過箱子更多的項目,盒子中的至少一個必須有其中有多個項目。
如果您想要查找!= 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]
由於此實現使用隨機性,因此每次運行它時都會產生不同的結果。
我非常抱歉,我應該指定language.i工作在c.i更喜歡c代碼,你能給我一個簡單的算法來做c嗎?我還沒有學過哈希,我不知道是否有任何其他簡單的方法來實現這個問題在C語言,謝謝 –
你可以用一個數組的數組替換散列,因爲你使用的是整數值。但是,我不會爲你寫。你問了一個算法,我用僞代碼給了你一個算法,並且證明它確實有效。您必須成爲將其翻譯成您想要工作的語言的人。 – pjs
聲明您希望實現C,並且希望避免散列的解決方案可以改變您的問題。這是在StackOverflow上皺起了眉頭。相反,您應該將更受限制的版本作爲另一個問題發佈。但請注意,你很可能讓人們低估你,並告訴你這不是一個代碼寫作服務。 – pjs
此網站是用於編程問答。你會有更好的運氣http://math.stackexchange.com/ – Aaron
@Aaron算法是編程/ CS,而不是數學。 – RBarryYoung
@RBarryYoung離散數學和CS之間的界限可以是模糊的,不管這個問題可能屬於http://cs.stackexchange.com/或http://math.stackexchange.com/ –