求一个关于数组的算法(200分)

rqx110 2010-06-28 10:44:18
假设有一个数组A里面有32个元素:A[32]={0.12, 0.25, 0.26,.......}
元素已经按从小到大的顺序排列

要求:
1. 调整元素的大小使相邻的2个元素之差不得小于0.05.
2. 尽可能的少地调整元素值
3. 高效率
...全文
321 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
rqx110 2010-07-02
  • 打赏
  • 举报
回复
看来没什么人来了,结贴了。
huwen7565833 2010-06-30
  • 打赏
  • 举报
回复
友情帮顶!~!~!
rqx110 2010-06-30
  • 打赏
  • 举报
回复
写错了 是29楼 的折半法
rqx110 2010-06-30
  • 打赏
  • 举报
回复
非常感谢各位的积极参与,目前比较看好 19楼 的折半法。

本帖将在本周五17点之前结贴,也希望大家继续参与,来者有分。
zl402263140 2010-06-30
  • 打赏
  • 举报
回复
受教了!但没怎么看懂
rqx110 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yaazz 的回复:]

C# code

double[] a = new double[] { 0.12, 0.13, 0.25, 0.35, 0.36, 0.75, 0.76 };
double[] t = new double[2] { 0, 0 };
int i = 0;

for (; i < a.Length - 1; i++)
……
[/Quote]

咋一看,你这里都是交换。我需要的是对元素做加减 使其两两差>0.05
Comeonzhou 2010-06-29
  • 打赏
  • 举报
回复
帮顶了..现在看到计算就头痛...
yaazz 2010-06-29
  • 打赏
  • 举报
回复

double[] a = new double[] { 0.12, 0.13, 0.25, 0.35, 0.36, 0.75, 0.76 };
double[] t = new double[2] { 0, 0 };
int i = 0;

for (; i < a.Length - 1; i++)
{
if (a[i+1] - a[i] < 0.05)
{
if (t[1]!=0)
{
a[(int)t[0]] = a[i + 1];
a[i + 1] = t[1];
t[1] = 0;
}
else
{
t[0] = i + 1;
t[1] = a[i + 1];
}
}
}

if (a[i]-a[i-1]<0.05)
{
double tmp = a[i];
a[i] = a[0];
a[0] = tmp;
}
rqx110 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wowufeng 的回复:]


[/Quote]

结果没问题,假设数组是 0.12,0.13,0.18,0.23,0.28,0.35,0.4 这样子,安照你的算法是每一个都去调整,但其实只需要调整第一个 0.12 -> 0.08

不知道还有没有更优的算法。期待高手。
wowufeng 2010-06-29
  • 打赏
  • 举报
回复


/*
* Created by SharpDevelop.
* User: csjxp
* Date: 2010-6-29
* Time: 18:15
*
*
* 思路是A(1),A(2),A(3),.....A(n);
*
* 假设存在A(n),A(m)其中 m=n+1,不满足A(m)>=A(n)+0.05;
*
*这个时候有两种办法
*
* 1是A(m)=A(n)+0.05;
*
* 2是A(n)=A(m)-0.05;
*
* A(m)后面的数字是基于A(m)来改变的,如果增大A(m),后面的元素会改变很多
*
* 如果采用方法2 A(1)..A(n-1)是排列好了的,A(m)...A(last) 还是基于A(m)的大小
* 所以采用A(n)=A(m)-0.05;
*
* 但是采用方法2必须有先决条件
*
* 那就是A(n)=A(m)-0.05之后,必须还要满足 A(n)>=A(n-1)+0.05;
*
* 如果不满足就没办法 只有A(n)=A(n-1)+0.05;
*
* 因为A(n)进行了改变,所以再一次比较 A(n)与A(m)的值;
*
* 如果A(m)<A(n)+0.05;
*
* 那只能采用1,A(m)=A(n)+0.05;
*
* 然后递归
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/

using System;

namespace test
{
/// <summary>
/// Description of Class1.
/// </summary>
public class Class1
{
static void Main()
{
double[] aa=new double[]{0.12,0.13,0.17,0.23,0.28,0.35,0.36};
Regulation(aa,1,aa.Length);

for(int i=0;i<aa.Length;i++)
{
Console.WriteLine(aa[i]);
}

// double[] bb=new double[]{0.13,0.15,0.26,0.,0.28,0.35,0.4};

Console.ReadKey();
}

static void Regulation(double[] aa,int first,int last)
{
if(first>=last)
return;
//第一个元素
double entry=aa[first-1];

//后面那个元素和前面那个元素比较
if(aa[first]<entry+0.05)
{
entry=aa[first]-0.05;
}

if(first==1 || entry>=aa[first-2]+0.05)
{
aa[first-1]=entry;
}
else
{
aa[first-1]=aa[first-2]+0.05;
}

if(aa[first]<aa[first-1]+0.05)
aa[first]=aa[first-1]+0.05;

Regulation(aa,first+1,last);
}
}
}



wanghui0380 2010-06-29
  • 打赏
  • 举报
回复
折半法
double[] a = new double[] { 0.12, 0.13, 0.25, 0.35, 0.36, 0.75, 0.76,0.77};
int length = a.Length/2;
for(int i=0;i<length;i++)
{
if (length+i+1<a.Length&&a[length+i+1]-a[length+i]<0.05)
{
a[length + i+1] = a[length+i] + (double)0.05;
}
if (length-i-1>=0&& a[length-i]-a[length-i-1]<0.05)
{
a[length - i - 1] = a[length - i] - 0.05;
}

}
lds1ove 2010-06-29
  • 打赏
  • 举报
回复
sff
wanghui0380 2010-06-29
  • 打赏
  • 举报
回复
你就不妨这么想,把块石头投进水里,他会由里到外的产生波纹
wanghui0380 2010-06-29
  • 打赏
  • 举报
回复
典型的折半算法,是中值开始同时向两边调整,因为是由里及外的调整,所以本身数列的扰动非常小
rqx110 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 hetl_1985 的回复:]

就你给出的数据没有什么意义啊,如果是变量的话是没有解的
[/Quote]

有解啊,13楼就解了。我只是希望能有更好的算法,使要调整的元素个数尽量的少。
rqx110 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 cainiao116 的回复:]

尽可能的少地调整元素值


是说的调整的总的值尽可能少 ,还是调整的数的个数尽可能少?
[/Quote]

个数
悔说话的哑巴 2010-06-29
  • 打赏
  • 举报
回复
就你给出的数据没有什么意义啊,如果是变量的话是没有解的
悔说话的哑巴 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 rqx110 的回复:]
引用 19 楼 hetl_1985 的回复:

你把条件修改一下就可以了


怎么修改
[/Quote]
tmp = a[1];
a[1] = a[2];
a[2] = tmp;
cainiao116 2010-06-29
  • 打赏
  • 举报
回复
尽可能的少地调整元素值


是说的调整的总的值尽可能少 ,还是调整的数的个数尽可能少?
rqx110 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 hetl_1985 的回复:]

你把条件修改一下就可以了
[/Quote]

怎么修改
加载更多回复(15)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧