- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种算法,将正数序列分割成 n 个子序列,从而使每个子集中数字之和的标准差最小化。
每个子序列中数字的顺序需要与原始序列中的顺序相同
例如:
假设我有一个序列 {1,1,1,1,1,1,10,1},我想将其分割成 2 个子序列。
我相信最佳解决方案是 {1,1,1,1,1,1}, {10,1} 。
第一个子序列的和是6,第二个子序列的和是11
这两个数字的标准差约为 3.5,我认为这是最低的。
假设我有一个序列 {4,1,1,1,1,6},我想将其分割成 3 个子序列。
我相信最佳解决方案是 {4}、{1,1,1,1}、{6}
子序列之和为4、4、6。
3 个数字的标准偏差为 ~1.15,我认为这是可能的最低值。
我能想出的最好的算法是找到序列中每个数字的累积和,并在 [totalSum/numSubsequences] 的每个间隔处分割序列。
例如,给定序列{4,1,1,1,1,6},每个序列的数字累加和为{4,5,6,7,8,14}。序列中所有数字的总数是 14,因此,如果我想要 3 个子序列,我应该在总数达到 14/3 = 4.66 和 2 * 14/3 = 9.333333 时分割序列。
但是,在序列中并没有累计总数等于 4.66 的实际位置 - 第一个累计总数是 4,下一个累计总数是 5。那么我应该向上取整还是向下取整?在这种情况下,向下舍入到 4 会给出最佳解决方案,但情况并非总是如此。我能想到的最好办法是尝试向上和向下舍入的每种组合,但这会导致 O(2^numSubsequences) 复杂度。
这似乎是一种可以应用预先存在的算法的东西,但是我的谷歌搜索失败了。我知道 Partition Problem ,它是 NP 完全的,但它处理无序集,而不是有序序列。
如有任何帮助,我们将不胜感激。
最佳答案
假设原始序列的长度为L
子序列的数量是N
.
您可以 simplify the expression for standard deviation得到sqrt(E[X^2] - E[X]^2)
, 其中E
表示期望/平均值和 X
表示你的随机变量——在你的例子中,是子序列的总和。 (类似的公式适用于“样本标准偏差”。)请注意 E[X]
不取决于您如何分割序列,因为它总是总和除以 N
。 .因此,我们只想最小化 E[X^2]
或等效地,X^2
的总和(根据平均值的定义,它们相差 N
倍)。
至此,我们可以看出这个问题可以用动态规划来解决。让f(i,j)
, 对于 i
来自 0
至 M
和 j
来自 1
至 N
, 是第一个 i
的 split 子序列总和的最小平方和将序列的元素放入 j
子序列。然后我们看到 f(i,j)
可以根据所有 f(i',j')
来计算与 i' <= i
和 j < j'
.更具体地说,如果您的序列是 a[k]
索引自 0
至 M-1
:
f(i,1) = sum( a[k] for 0 <= k < i )^2
f(i,j) = minimum of f(l,j-1)+sum( a[k] for l < k < i )^2 for l from 0 to i
最小化f(N,L)
,您可以使用标准动态规划技术来恢复拆分。特别是,您可以存储 l
最小化 f(i,j)
.
此解决方案的运行时间为 O(L^2 N)
因为你计算 O(L N)
f
的不同值和 minimum
结束O(L)
l
的不同值.
这是 Perl 中的一个简单实现:
#!/usr/bin/perl
use strict;
use warnings;
local $\ = $/;
print join ", ", map {"@$_"} best( 2, qw(1 1 1 1 1 1 10 1) );
# prints "1 1 1 1 1 1, 10 1"
print join ", ", map {"@$_"} best( 3, qw(4 1 1 1 1 6) );
# prints "4, 1 1 1 1, 6"
sub best {
my( $N, @a ) = @_;
my( @f, @g, $i, $j, $k, $sum );
# DP base case
$sum = 0;
$f[0][1] = $g[0][1] = 0;
for $i ( 1 .. @a ) {
$sum += $a[$i-1];
$f[$i][1] = $sum * $sum;
$g[$i][1] = 0;
}
# DP recurrence
for $j ( 2 .. $N ) {
$f[0][$j] = $g[0][$j] = 0;
for $i ( 1 .. @a ) {
$sum = 0;
$f[$i][$j] = $f[$i][$j-1];
$g[$i][$j] = $i;
for $k ( reverse 0 .. $i-1 ) {
$sum += $a[$k];
if( $f[$i][$j] > $f[$k][$j-1] + $sum * $sum ) {
$f[$i][$j] = $f[$k][$j-1] + $sum * $sum;
$g[$i][$j] = $k;
}
}
}
}
# Extract best expansion
my( @result );
$i = @a; $j = $N;
while( $j ) {
$k = $g[$i][$j];
unshift @result, [@a[$k .. $i-1]];
$i = $k;
$j--;
}
return @result;
}
关于algorithm - 使用什么算法将数字序列分割成n个子集,以最小化每个子集中数字之和的标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2166335/
我有一个关于 DFA 最小化的问题。所以我使用了众所周知的技术将正则表达式转换为 NFA,然后使用 goto/closure 算法从中构造 DFA。现在的问题是如何将其最小化?我在这里看过有关它的课文
这是我的代码,当鼠标光标悬停在 TPanel 上时,它会“动画化”它。我还有一个代码块来取消它的动画。 procedure Tmain.pStarting1MouseEnter(Sender: TOb
我有图像 slider ,其中图像在超时时相互替换。我使用 jQuery 函数 setInterval() 但有一个小问题,在最小化浏览器窗口后,该函数继续“工作”,并且我恢复浏览器窗口图像的位置以令
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How can I stop a double click of the window title bar
当我在我的 Windows 窗体应用程序中单击最小化按钮时,我不希望它执行经典的 Windows 最小化动画(窗口下降到任务栏)。 据我所知,没有最小化事件,我只能使用调整大小,但我不知道如何检测我是
首先 - 对不起我的英语。 我刚刚创建了 Android 应用程序。它包含几个 Activity ,并在此应用程序的背景下播放音乐。当用户以某种方式(通过单击“后退”按钮、主页按钮或其他方式)离开应用
我需要帮助编写一个程序,该程序以 (X,Y) 的形式给出指定数量的坐标点。将给出的点数是程序中的第一行;它可以通过扫描仪读取。 我需要计算覆盖线 x = a 和 y = b 的所有点的最小面积。因此,
我需要一个 Activity 返回到上一个 Activity ,但如果再次单击该按钮,它将恢复上次的 Activity 。这是所需的过程:我点击一个按钮, Activity 开始。如果我点击“后退”按
随着这个动画变得越来越复杂,我不断添加参数,以便它们在每次回调时可用。目前共有 6 个。 例如,现在我想在显示消息时禁用输入框,因此我必须添加另一个元素 - in_element; 电话: M
这是一个基于对话框的 MFC 应用程序。我并没有故意添加任何关于最小化、最大化和恢复按钮的代码。它可以首先显示那些按钮。但它在长时间运行后就会消失。或者计算机的 sleep 可能导致此问题? 我不知道
如何使用 Windows API 禁用窗口的最大化和/或最小化功能?最大化/最小化框需要变灰并禁用,双击标题栏、拖动到屏幕顶部等也需要不起作用。 最佳答案 您可以调用 SetWindowLong/Se
是否有任何已知的算法帽子可以解决以下问题:我们有一个 session ,有多个同时会谈。用户应标记感兴趣的会谈,然后我们要创建一个会谈时间表,以便我的大多数人都可以参加他们的会谈并最大限度地减少日程冲
目前我负责为一个小项目开发一个(C++)窗口类;目标是将依赖性保持在最低限度。Win32/WinAPI 的实现按预期工作,但是,当涉及到 Linux/XCB 时,我正在努力。 我知道,我可以检查“_N
windows C++编程,如何让事件窗口最大化或最小化? 对于鼠标按下事件,我们使用类似 mi.dwFlags = MOUSEEVENTF_LEFTDOWN 的东西,并使用 SendInput()
我编写了以下获取 2 个参数的构造函数,如果值(x 或 y)为负,它将被初始化为零。 public Point1 ( int x , int y ) { //if one or
我有以下代码,如果我将导航窗口最大化,它运行良好,但是当我最小化它时它停止工作。 更多细节: 当窗口最小化时,“scrollDown & scrollTop”函数停止执行。 'use strict'
我有一个包含一些宏和用户表单的 Excel 文件。 我不希望用户在没有密码的情况下访问文件本身。他们应该只能看到用户表单并通过用户表单输入数据。 这是我目前拥有的代码。 Private Sub Wor
目前,我正在尝试训练一个同时具有复值张量作为输入和输出的网络。作为损失函数,我采用输出与真实值之间逐点差异的范数。 当我尝试最小化损失函数时,tensorflow 的“最小化”函数提示意外的复数。我觉
这个函数是我想要优化的主力。任何关于如何限制其内存使用的想法都会很棒。 function F(len, rNo, n, ratio = 0.5) s = zeros(len); m = co
在 Qt 下的 Windows Mobile 和 Symbian 平台上,如何通过单击应用程序中的某个按钮来最小化我的应用程序? 最佳答案 大概QWidget::setWindowState将适合您,
我是一名优秀的程序员,十分优秀!