这几乎肯定不是面试官想要的答案,但我会提出这个方案,只是为了看看他们的反应:
假设所有卡片大小相同,严格为矩形,没有孔洞,但它们在X,Y方向上随机放置,并以θ角度随机定向。因此,每张卡牌都由三元组(x,y,theta)或四元组(四个角的位置)来描述。有了这些信息,我们可以很简单地进行蒙特卡罗分析。
只需在桌面表面随机生成若干点,并使用列表确定每个点是否被任何卡片覆盖。如果是,则保留它;如果不是,则将其丢弃。通过保留点数与总点数的比率来计算卡片的面积。
显然,您可以在O(n)时间内测试每个点,其中n是卡片数量。然而,我认为这里有一种巧妙的小技巧,我认为它能加快速度。您可以使用适当的网格大小(与卡片大小相关)对桌面进行网格化,并预处理卡片以确定它们可能存在于哪些网格中。(您可以过度估计,将卡片预处理为直径在对角线之间的圆形碟。)现在,用网格位置作为键构建哈希表,每个网格位置的内容是可能重叠该网格的任何可能卡片。(卡片将出现在多个网格中。)
现在,每次您需要包含或排除一个点时,您不需要检查每张卡片,而只需检查可能存在于该点网格位置的预处理卡片。
这种方法有很多优点:
- 您可以相当容易地将其更改为使用非矩形卡片,特别是如果它们是凸面的。
- 如果必须(在这种情况下,几何形状确实变得很麻烦),您可能可以将其更改为使用不同大小或形状的卡片。
- 如果你在一家从事科学或工程工作的公司面试,他们会喜欢它。
- 它可以很好地并行化。
- 它太酷了!!
另一方面:
- 这是一种近似技术(但您可以以任何精度运行!)
- 你处于预期运行时间的领域,而不是确定性运行时间的领域。
- 有人可能会问你关于蒙特卡罗的详细问题。
- 如果他们不熟悉蒙特卡罗,他们可能会认为你在胡说八道。
我希望能为这个想法贡献一份力量,但遗憾的是,我从一篇论文中学到了这个想法,该论文基于蛋白质中原子的位置和大小计算表面积。(基本上是相同的想法,除了现在我们有一个三维空间中的3D网格,并且卡片确实是圆盘。我们会遍历每个原子,在其表面生成大量点,并查看它们是否是其他原子的内部。)
编辑: 我想到原始问题规定总表面积远大于总卡片面积。在这种情况下,适当的网格大小意味着大多数网格
必须为空闲状态。一旦建立了哈希表,您还可以预处理网格位置,并完全消除这些位置,仅在可能被占用的网格位置内生成点。(基本上,在每个潜在遮挡的网格位置上执行单个MC估计。)