- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于一项作业,我需要解决一个数学问题。我将其缩小为以下内容:
令 A[1, ... ,n]
为 n
整数数组。
令y
为整数常量。
现在,我必须编写一个算法,在 O(n)
时间内找到 M(y)
的最小值:
M(y) = Sum |A[i] - y|, i = 1 到 n
。请注意,我不仅采用 A[i] - y
,还采用绝对值 |A[i] - y|
。
为清楚起见,我还将此等式放在 Wolfram Alpha 中.
我考虑过最小二乘法,但我认为这不会产生 M(y)
的最小值,而是更多的 A
的平均值。由于我采用的是 A[i] - y
的绝对值,因此我也无法将此函数与 y
区分开来。此外,我不能想出任何算法,因为我必须在 O(n)
时间内完成。此外,我相信在某些情况下 y
可以有更多正确答案,在这种情况下,y
的值必须等于 的整数元素之一>A
.
这真的困扰了我整整一个星期,但我仍然没有弄明白。任何人都可以教我走的路或指出正确的方向吗?我卡住了。非常感谢您的帮助。
最佳答案
您想为 M(y) = sum(abs(A[i] - y))
选择一个 y是最小的。让我们假设每个 A[i]
是正数(它不会改变结果,因为问题是平移不变的)。
让我们从两个简单的观察开始。首先,如果你选择 y 这样 y < min(A)
或 y > max(A)
,你最终得到的 M(y) 值比你选择 y 的值要大,这样 min(A) <= y <= max(A)
.此外,A 存在唯一的局部最小值或最小值范围(M(y) 是凸的)。
所以我们可以从在区间 [min(A) .. max(A)]
中选择一些 y 开始并尝试移动这个值,以便我们得到更小的 M(y)。为了让事情更容易理解,让我们对 A 进行排序并在 [1 .. n]
中选择一个 i (所以 y = A[i]
)。
需要考虑三种情况。
如果A[i+1] > A[i]
,或者 {n 是奇数并且 i < (n+1)/2
} 或 {n 是偶数且 i < n/2
}, 然后 M(A[i+1]) < M(A[i])
.
这是因为,从 M(A[i])
至 M(A[i+1])
,减少的项数(即 n-i
)大于增加的项数(即 i
),并且增加或减少的数量始终相同。在 n 为奇数的情况下,i < (n+1)/2 <=> 2*i < n+1 <=> 2*i < n
,因为 2*i 是偶数(因此必然小于我们从中减去一个的更大的偶数)。
用更正式的话来说,M(A[i]) = sum(A[i]-A[s]) + sum(A[g]-A[i])
,其中 s 和 g 代表这样的索引 A[s] < A[i]
和 A[g] > A[i]
.所以如果A[i+1] > A[i]
, 然后 M(A[i+1]) = sum(A[i]-A[s]) + i*(A[i+1]-A[i]) + sum(A[g]-A[i]) - (n-i)*(A[i+1]-A[i]) = M(A[i]) + (2*i-n)*(A[i+1]-A[i])
.自 2*i < n
和 A[i+1] > A[i]
, (2*i-n)*(A[i+1]-A[i]) < 0
, 所以 M(A[i+1]) < M(A[i])
.
类似地,如果A[i-1] < A[i]
,或者 {n 是奇数并且 i > (n+1)/2
} 或 {n 是偶数且 i > (n/2)+1
}, 然后 M(A[i-1]) > M(A[i])
.
最后,如果 {n 是奇数且 i = (n+1)/2
} 或 {n 是偶数且 i = (n/2) or (n/2)+1
},那么你有一个最小值,因为递减或递增 i 最终将分别引导你到第一种或第二种情况。 i 有剩余的可能值,但所有这些都导致 A[i] 也是最小值。
A的中位数恰好是i满足最后一种情况的值A[i]。如果 A 中的元素个数是奇数,那么只有一个这样的值,y = A[(n+1)/2]
(但可能有多个索引);如果它是偶数,那么你有一个范围(可能只包含一个整数)这样的值,A[n/2] <= y <= A[n/2+1]
.
有一个标准的 C++ 算法可以帮助您在 O(n) 时间内找到中位数:nth_element .如果您使用其他语言,请查找 the median of medians algorithm (Nico Schertler pointed out )甚至 introselect (这是 nth_element 通常使用的)。
关于arrays - 求 A[i] 与常数之差的最小总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39756662/
我不明白基因编程的人工智能是如何实现的。可以确定最终方程中何时应该有一个常数。如果我采用公式 F(m) = ma; F(m) = m9.8,A.I.知道真正的数字 9.8 到底是多少吗?据我了解,您实
我的批次大小是可变的,所以我的所有输入都是以下形式 tf.placeholder(tf.float32, shape=(None, ...) 接受可变的批量大小。但是,如何创建具有可变批处理大小的常数
我有一个一维 Numpy 数组 A长度N .对于每个元素 x在数组中,我想知道数组中所有元素在[x-eps]范围内的比例是多少; x+eps ],其中 eps是一个常数。 N数量级为 15,000。
如果我像这样在文件中设置一些常量: 'use strict'; angular.module('balrogApp.config', []) .constant('balrogConfig',
谁能给我一个常量 r 值的例子? 因为显然即使文字也是右值而不是常量右值。 最佳答案 const T f(); 根据该定义,表达式 f() 是 const T 类型的右值表达式,即常量右值。 关于c+
我正在开发一个 Angular 应用程序,我想创建一个配置文件。根据我的阅读,我应该使用 Angular 常数。 所以我尝试创建我的常量。从我读到的内容( here , here 以及 here +
const int N = 100; void function1(int array[]){ // ... } void function2(int arra
考虑以下(工作)片段: Eigen::ArrayXd x (8); x > y (x.data(), 2, 4); 这也是可行的: const Eigen::ArrayXd const_x = x;
我知道你可以使用: #define _USE_MATH_DEFINES 然后: M_PI 得到常量 pi。但是,如果我没记错的话(欢迎评论)这是编译器/平台相关的。那么,当我将 pi 常量从 Linu
为什么这段代码无法编译? package main const a = 1.000001 const base = 0 const b = a+base func main() { f(b)
为什么下面的代码每条语句都引用了大O常量(这里我为了约定使用1)? 我的意思是,如果数组大小变大,时间复杂度可能会变大,对吗?而且总数会越来越大,会不会影响复杂度? 伪代码: def find_sum
我正在尝试创建一个函数来填充多个系列中缺失的数字,具有不同的数字比例,同时为每个系列生成一个常量列。 from tika import parser import pandas as pd impor
我正在尝试近似 e 的值(~2.7) 由此定义,对于每个第 n 项 在Python中使用递归函数。 到目前为止我已经得到了这个, def NapierConstant(runs): retur
系统提示我输入代码以某种方式打印 Champerowne 常量系列。 (实际使用它!)所以我们想找到这个系列的第 n 个数字:1234567891011121314...这是我的代码: #inclu
我正在学习硕士定理的期中考试,我遇到了案例 2 的示例,其中 k > 0。除了常数及其递增或计算方式之外,我了解有关定理的所有内容。 Case 2状态:T(n) = Θ(nlogba logk+1n)
问题实例:无向无权图 G=(V,E)。两个源节点a和b,两个目的节点c和d以及一个常数D(完全正数)。(我们可以假设lambda(c,d),lambda(a,b)>D,当lambda(x,y ) 是
我有一张很大的 table 。 它目前在 MySQL 数据库中。 我使用django。 我需要迭代 每个表的元素来预先计算一些特定的数据(也许如果我更好的话,我可以这样做,但这不是重点)。 我想在不断
VBScript 常数 常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。VBScript 定义了许多内部常数。详细信息,请参阅 VBScript 语言参考。 创建常数 您可以使用
我正在学习 javascript,我发现一个文件中有许多用操作数“:”而不是“=”完成的赋值。尽管问题的标题是这样,但我也在非常量中看到过它。那有什么意义呢?这里的“:”操作数是什么意思?谢谢。 v
鉴于应用程序启动: angular.module("starter", [ "ionic" ]) .constant("DEBUG", true) .run(function() {
我是一名优秀的程序员,十分优秀!