【问题标题】:How to find the "odd one out" in a list of numbers如何在数字列表中找到“奇数”
【发布时间】:2019-11-06 15:52:24
【问题描述】:

我有一个数字数组 [x1、x2、x3 等],其大小超过 20 个元素,我正在尝试组合一个算法,根据元素相对于列表的其余部分。

在给定阈值 T1 的情况下,我将“奇数”定义为与重心的距离。重心是值往往集中的地方,可能给定第二个阈值 T2。

示例: [20, 20, 21, 31, 24, 20, 70, 21, 31, 24, 20, 20, 21, 31, 24, 20, 20, 21, 31, 24] 和 T1=10 重心大约是 24,只有奇数一个是 70

这种情况是微不足道的,因为熟悉的“距均值或中位数的距离”指标会做,例如。 d(70)=|24-70|=46>10=T1 和 d(31)=|24-31|=7

我不太清楚如何处理具有 2 个或更多重心的更一般情况。

示例 2: [20、20、21、31、24、20、70、21、31、24、120、120、121、131、124、120、120、121、131、124] 现在有两个重心 d1=24 和 d2=124,唯一的奇数仍然是 70

但之前的指标分解了。也许困难的部分是找出哪些是重心。

注意:我正在寻找一种快速的算法,而不是一个准确的算法

【问题讨论】:

  • @Balmar 我不是在寻找特定的解决方案。我面临的问题是理论计算机科学。我试图包含尽可能多的信息和尽可能多的信息。什么样的最小可重现示例适合这种情况?
  • 这是一个编程问答,问题和答案一般预计会涉及实际代码。更多抽象的CS问题可以在Computer ScienceTheoretical Computer Science提出
  • 对此我很抱歉。
  • 为了让网站更容易接受您的问题,您可以考虑将python 标记替换为language-agnostic,并可能会问,如何解决这个问题?
  • 我很惊讶,因为我看到这种帖子到处都是。

标签: algorithm sorting language-agnostic computer-science


【解决方案1】:

听起来您要解决的一般问题是:绘制尽可能少的半径-R 圆,以使所有输入都被至少一个圆覆盖;然后,找到包含少于 k 个输入的圆圈。

在您的第一种情况下,您绘制了两个半径为 10 的圆:第一个包含除 70 之外的所有输入,第二个仅包含 70。您检测异常圆的标准应该捕捉到包含 70 的圆,这应该很简单。在第二种情况下,您绘制了三个半径为 10 的圆。同样,仅捕获 70 的标准应该很容易说明。

如果我要从头开始执行此操作,而不查找问题的名称(这可能是一个众所周知的问题,具有良好的众所周知的解决方案),我将从对输入进行排序开始,这可能会非常很有帮助,因为这是一个一维问题。接下来,我可能会在输入上运行一个大小为 2R 的滑动窗口,并计算每个潜在重心的移动频率(跳过重复项和跳跃间隙),分别保存这个频率序列。然后,我会贪婪地将窗口首先放在频率最高的位置,尽可能不重叠,直到所有输入都被覆盖。然后,我会识别出任何被圆圈覆盖的输入,这些圆圈的移动频率小于与所选窗口的平均移动频率相关的某个截止值;例如,将所有圆圈覆盖的所有输入视为异常,与所有圆圈覆盖的平均值相比,它们覆盖的输入数量是一半或更少。

例子:

INPUT:  20, 20, 21, 31, 24, 20, 70, 21, 31, 24, 20, 20, 21, 31, 24, 20, 20, 21, 31, 24

SORTED: 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 24, 24, 24, 24, 31, 31, 31, 31, 70

WINDOW MOVING FREQUENCY:
20: 15
21: 19
(detects gap, jumps)
60: 1
(detects gap, jumps, ends)

WINDOW #1: [11,31]: 19
WINDOW #2: [50, 70]: 1

AVERAGE: 10
50% AVERAGE: 5
WINDOW #1 OVER CUTOFF
WINDOW #2 UNDER CUTOFF

例子:

INPUT:  20, 20, 21, 31, 24, 20, 70, 21, 31, 24, 120, 120, 121, 131, 124, 120, 120, 121, 131, 124

SORTED: 20, 20, 20, 21, 21, 24, 24, 31, 31, 70, 120, 120, 120, 120, 121, 121, 124, 124, 131, 131

WINDOW MOVING FREQUENCY:
20: 7
(detects gap, jumps)
60: 1
(detects gap, jumps)
110: 4
111: 6
(detects gap, jumps)
114: 8
(detects gap, jumps)
121: 10

WINDOW #1: [111, 131]: 10
WINDOW #2: [10, 30]: 7
WINDOW #3: [50, 70]: 1

AVERAGE: 6
50% AVERAGE: 3

WINDOW #1 ABOVE CUTOFF
WINDOW #2 ABOVE CUTOFF
WINDOW #3 BELOW CUTOFF

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 2020-05-20
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2016-03-21
    • 2022-11-18
    • 2014-03-18
    相关资源
    最近更新 更多