我如何解决有关鸽子原理(离散数学)的问题?

How do I solve this question about Pigeonhole Principle (Discrete Mathematics)?

我不明白下面的问题。我的意思是我想知道这个问题的示例输入输出:"The pigeonhole principle states that if a function f has n distinct inputs but less than n distinct outputs,then there exist two inputs a and b such that a!=b and f(a)=f(b). Present an algorithm to find a and b such that f(a)=f(b). Assume that the function inputs are 1,2,......,and n.?"

由于我没有清楚地理解问题,因此无法解决此问题。寻求您的帮助。

继续所说的内容。 假设您将长度为 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 中具有相同的索引。

希望有用。

那我们一步步来吧。

我有2个盒子。我爸爸给了我3块巧克力....

我想把那些巧克力放在 2 个盒子里。为了我们的利益,让我们将巧克力命名为 abc.

那么我们可以放多少种方式呢?

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

你看到了什么奇怪的东西?至少有一盒超过1颗巧克力。

那你怎么看?

您可以尝试使用任意数量的盒子和巧克力(多于盒子数量)并试一试。你会发现这是对的。

好吧,让我们让它变得更简单:

我有5个朋友3个房间。我们正在开派对。现在让我们看看会发生什么。 (我所有的朋友都会坐在任何一个房间)

我声称至少会有一个房间,那里会有超过 1 个朋友。

我的朋友们都很恶作剧,他们知道这一点后试图证明我是错的。

  • Friend-1 选择房间 1。
  • Friend-2 认为为什么是 room-1?那么我会是正确的,所以他选择了 room-2
  • 朋友 3 也这么想...他避开 1 和 2 房间进入房间 3
  • 朋友 4 现在来了,他知道没有其他空房间,所以他必须进入某个房间。这样我就正确了。

所以你了解情况了吗?

有n个朋友(functions)但不幸或(幸运)他们的房间(输出值)小于n。所以当然有我的 2 个朋友 ab 共享同一个房间。(相同的值 f(a)=f(b)

鸽巢原则说,如果你的物品多于箱子,那么至少有一个箱子必须有多个物品。

如果要查找哪些项 a != 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]

由于此实现使用随机性,因此每次 运行 都会产生不同的结果。