一个合并算法的问题-和有挑战性

wu_java 2005-12-27 09:48:19
有一个数组,num[100]={3,3,3,2,2,4,5,0,0,0,9,9,9,6,6,7,7,7,1,1,1,1,1,1,1,12,12,,12,45,58,65,}(我没把数组完全写出),数据都是有规律的,相同的数据只能连续出现,不连续的肯定不相同,并且数据连续出现的次数不一定。
要求把从num[n]开始的最近出现的三个不相同的数据,从数组中取出存放到数组rs[3]中,比如从num[5]开始的,结果应该是rs[3]={4,5,0}
我这只是为了便于说明问题用了数组,其实数据是很多的,可以上万、十万,最好不要用简单的循环遍历逐个的比较,请问怎么实现?
...全文
286 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
discolt 2006-01-04
  • 打赏
  • 举报
回复
少贴了一个递归查下一个数字索引的

// 计算下一个num的索引
static int nextIndex(int[] numArray, int index) {
if (index >= numArray.length - 1) {
System.err.println("array is over!");
return 0;
}

if (numArray[index] == numArray[index + 1]) {
return nextIndex(numArray, index + 1);
} else {
return index + 1;
}
}
discolt 2006-01-04
  • 打赏
  • 举报
回复
用递归,好像不是很难.

public static void main(String[] args) {
int[] nums = {3,3,3,2,2,4,5,0,0,0,9,9,9,6,6,7,7,7,1,1,1,1,1,1,1,12,12,12,45,58,65};

int[]result = result(nums, 5);

for (int i = 0; i < result.length; i++) {
System.out.print("[" + result[i] + "] ");
}
}

static int[]result (int[] data, int index) {

int[]result = new int[3];

int n1 = nextNum(data, index);
int n1Index = nextIndex(data, index);

int n2 = nextNum(data, n1Index);
int n2Index = nextIndex(data, n1Index);

int n3 = nextNum(data, n2Index);

result[0] = n1;
result[1] = n2;
result[2] = n3;

return result;
}

// 计算下一个num
static int nextNum(int[] numArray, int index) {
if (index >= numArray.length - 1) {
System.err.println("array is over!");
return 0;
}

if (numArray[index] == numArray[index + 1]) {
return nextNum(numArray, index + 1);
} else {
return numArray[index + 1];
}
}


结果:[5] [0] [9]
风月无边 2006-01-04
  • 打赏
  • 举报
回复
为什么不试验一下正则表达式,速度傻快傻快的
bilujun 2005-12-29
  • 打赏
  • 举报
回复
在没有其他额外信息,就你提出的问题而言,还有比遍历O(n)更好的算法吗?
bilujun 2005-12-29
  • 打赏
  • 举报
回复
建立索引难道不要一个一个比较吗?还不是遍历。
wu_java 2005-12-29
  • 打赏
  • 举报
回复
我可能是在问题中没把问题说清楚,这个算法的主要目的是提高检索的效率,楼上说的建立数组索引是一个好的方法,这也将是很费时间的,怎么能快速的建立这个索引呢?
这个索引不简单的取几个数据,而是要统计每个重复出现的数据在数组中的开始和结束位置。
CalvinKyle 2005-12-28
  • 打赏
  • 举报
回复
nod楼上,不做索引只能遍历
gzhiceberg 2005-12-28
  • 打赏
  • 举报
回复
idx[100]={0,3,5,6,7,10.....}
索引数组记录第n个数的起始位置,取值就是:根据上例取值就是
rs[]={num[idx[5-3]]、num[idx[5-2]]、num[idx[5-1]]};
不过要增加维护索引数组的开销,但如果数据量大的话是华算的
gzhiceberg 2005-12-28
  • 打赏
  • 举报
回复
做一个索引数组啊
wu_java 2005-12-27
  • 打赏
  • 举报
回复
不是你所想的,是数据量很多的,总是数据很多,其中有一些是重复的,把不重复的提取出来,要是遍历 话那效率不是太低了吗?有百万条信息时候可能要几分钟了。
李欣欣1981 2005-12-27
  • 打赏
  • 举报
回复
用遍历不是最简单的吗?
不是全部遍历呀,只是从指定位置开始,到找到3各不同的数,就退出遍历了。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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