我有一个数字数组[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 <10 = T1
我不太清楚如何处理具有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
但先前的度量标准破裂了。也许最困难的部分是弄清哪些是重心。
注意:我正在寻找一种快速的算法,而不是一种准确的算法
答案 0 :(得分:0)
听起来您要解决的一般问题是:绘制尽可能少的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