鸽笼原理(离散数学)

时间:2017-02-15 16:00:02

标签: algorithm discrete-mathematics

我不理解这个问题,我的意思是我想知道这个问题的样本输入输出,问题是:“鸽子原理说明如果函数f有n个不同的输入但少于n个不同的输出,那么那里存在两个输入a和b,使得a = = b和f(a)= f(b)。现有算法找到a和b使得f(a)= f(b)。假设函数输入为1 ,2,......和n。?

我无法解决这个问题,因为我不清楚这个问题。 寻求你的帮助。

3 个答案:

答案 0 :(得分: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

如果您要识别拥有室友的所有鸽子,请使用空集初始化哈希值。然后遍历这些值并将当前值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]

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

答案 1 :(得分:0)

继续https://stackoverflow.com/a/42254627/7256243说的话。 假设您将长度为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 :(得分:0)

好吧,让我们一步一步走。

我有2个盒子。我父亲给了我3个巧克力....

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

那么我们可以采用多少种方法呢?

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

你看到一些奇怪的东西?至少有一个盒子里有1个以上的巧克力。

那你觉得怎么样?

您可以尝试使用任意数量的盒子和巧克力(超过盒子数量)并试试这个。你会看到它是对的。

让我们更容易:

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

我声称至少有一个房间会有一个以上的朋友。

我的朋友非常狡猾,知道这一点,他们试图证明我错了。

  • 朋友-1选择房间-1。
  • 朋友-2认为为什么房间1?那我就是对的,所以他选择了房间2
  • 朋友-3也认为一样......他避开1和2个房间并进入房间3
  • 朋友4现在来了,他知道没有其他空房间,所以他必须进入一个房间。因此我变得正确。

所以你了解情况?

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