Java 该不等式的优化与计算
假设我有一组整数,我想从中找出满足某个不等式的最大整数数。为了解释,Java 该不等式的优化与计算,java,c,algorithm,Java,C,Algorithm,假设我有一组整数,我想从中找出满足某个不等式的最大整数数。为了解释, r1,r2,r3。。。当ri为正整数时为rn。我想找到从1到n的最大z值,对于这个值ri我感觉有点糟糕,特别是对于我对这个问题所做的错误编辑。。。无论如何: 第一,解决这个问题最天真、最直接、最直接的方法;这将是从集合中的第一个数字开始,计算每一步的nth部分和,将该部分和与从第三个元素开始直到nth元素的每个元素的两倍进行比较。如果对每个元素进行比较,则将当前最后一个标记为最大值z 以下宏largestzfinder,取决于
r1,r2,r3。。。当ri为正整数时为rn。我想找到从1到n的最大z值,对于这个值ri我感觉有点糟糕,特别是对于我对这个问题所做的错误编辑。。。无论如何: 第一,解决这个问题最天真、最直接、最直接的方法;这将是从集合中的第一个数字开始,计算每一步的
n
th部分和,将该部分和与从第三个元素开始直到n
th元素的每个元素的两倍进行比较。如果对每个元素进行比较,则将当前最后一个标记为最大值z
以下宏largestzfinder
,取决于函数largestzfinderfunc
执行以下操作:
// indices are zero based
#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_))
unsigned int largestzfinderfunc( unsigned int set[], size_t size ) {
unsigned int largestz = 0;
unsigned int partialsumsofar = 0;
int disqualified;
for ( int i = 0; i < size; i++ ){
partialsumsofar += set[i];
disqualified = 0;
for ( int j = 2; j <= i; j++ ) { // for all j from 2 to i (inclusive)
if ( 2 * set[j] > partialsumsofar ) {
disqualified = 1;
break;
}
}
if ( !disqualified ) // if comparison held for all j
largestz = i;
}
return largestz;
}
// indices are zero based
#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_))
unsigned int largestzfinderfunc( unsigned int set[], size_t size ) {
unsigned int largestz = 0;
unsigned int partialsumsofar = 0;
int disqualified;
for ( int i = 0; i < size; i++ )
partialsumsofar += set[i];
for ( int i = size - 1; i >= 0; i-- ){
disqualified = 0;
for ( int j = 2; j <= i; j++ ) { // for all j from 2 to i (inclusive)
if ( 2 * set[j] > partialsumsofar ) {
disqualified = 1;
break;
}
}
if ( !disqualified ) { // if comparison held for all j
largestz = i;
break;
}
partialsumsofar -= set[i]; // updates/reduces partialsumsofar
}
return largestz;
}
现在,你看,我们逐个检查从第三个元素到最后一个元素的条件是否成立。。。而我们可以检查其中最大的一个!如果<代码>最大,则为最大[i-1])?集合[i]:最大的集合[i-1];
对于(int i=size-1;i>=0;i--){
如果(2*largestsofar[i]largestsofar)?设置[i+1]:largestsofar))){
返回j;
}
否则,如果(2*largestofar)的值能为负值吗?@OliCharlesworth,除非我计算错误,如果
rn>0
对于所有n
,那么任何z>=2
都将满足条件,因此在{1,2,3}的情况下,最大z
将是n
No@ThoAppelsin不适用于大于等于三的任何这样的子集,等式不成立。@ ThoAppelsin:考虑R= { 8, 1, 1 }。Z= n不是这里的情况(R1> 0.5*(8 + 1 +1))。那么,你想用一组像<代码> {8, 1, 1 }的答案是什么?其中没有z
满足条件?是否存在类似r\n
的条件作为递增集?
// indices are zero based
#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_))
unsigned int largestzfinderfunc( unsigned int set[], size_t size ) {
unsigned int largestz = 0;
unsigned int partialsumsofar = 0;
unsigned int * largestsofar = calloc( size, sizeof * largestsofar );
for ( int i = 0; i < size; i++ )
partialsumsofar += set[i];
largestsofar[0] = 0;
largestsofar[1] = 0;
largestsofar[2] = set[2];
for ( int i = 3; i < size; i++ )
largestsofar[i] = (set[i] > largestsofar[i-1]) ? set[i] : largestsofar[i-1];
for ( int i = size - 1; i >= 0; i-- ){
if ( 2 * largestsofar[i] <= partialsumsofar ) {
largestz = i;
break;
}
partialsumsofar -= set[i];
}
free( largestsofar );
return largestz;
}
// indices are zero based
#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_), (_x_)[0] + (_x_)[1], 1, 0)
unsigned int largestzfinderfunc( unsigned int set[], size_t size, unsigned int partialsumsofar, unsigned int i, unsigned int largestsofar ){
unsigned int j;
if ( i < size - 1 && ( j = largestzfinderfunc( set, size, partialsumsofar + set[i + 1], i + 1, ( set[i + 1] > largestsofar ) ? set[i + 1] : largestsofar ) ) ){
return j;
}
else if ( 2 * largestsofar <= partialsumsofar ) {
return i;
}
else
return 0;
}