日期:2014-05-17  浏览次数:20958 次

找一个数组最大值算法
一个2维数组,数字有大有小,数值会有重复
 
假设

int[,] XY;   大小 500*500



需要追踪最大值[]以及所在位置[]  比如 99 在 200,255  和 300,100

二位数组的,某个部份会改变 比如 位置 40,200 ,长 20,宽 30 的一个区域,里面的数值 会一次改变

想在每次改变后,继续能够方便的追踪整个2维数组最大值以及所在位置

求一高效算法,提示代码都欢迎





算法

------解决方案--------------------
表示语文学的不好,不能完全理解你的问题~
------解决方案--------------------
目前想到的还是循环。
第一次是在初如化时处理吧。
后面是其它小区域变化,那数据很少,如果变化区域出现了比最大数据还大的,就把最大数据更新,以后的变化类似。
------解决方案--------------------
可以把二维数组看成一个平面
对这个平面划分成M 行 N列个小的区域
每个区域保存一个最大值

根据变化区域算出 小区域变化的集合,
更新这些小区域的最大值

再找区域间的最值
------解决方案--------------------
引用:
一个2维数组,数字有大有小,数值会有重复
 
假设

int[,] XY;   大小 500*500



需要追踪最大值[]以及所在位置[]  比如 99 在 200,255  和 300,100

二位数组的,某个部份会改变 比如 位置 40,200 ,长 20,宽 30 的一个区域,里面的数值 会一次改变

想在每次改变后,继续能够方便的追踪……



1. 既然能改变数组,应该可以知道在哪里改变的。这个不用算法。
2. 若每次都是新数组,和旧的数组比较的话,只能循环了。一行一行的循环,用equal比较。若不相等再比较这一行。
------解决方案--------------------
给你一个思路:

对于 500*500数据集
用 A,B两个对象:
A:数据集合 50*50,则需要A[100] aList.(是否划分为更大或者更小区域则需测试)
B:最大值,坐标集合。 B[100] bList.(aList与bList一一对应)
B bMax:B[100]中求最大值对象(可能在 blist 中重复);

初始化:
Function Init:
Data->A[100] aList;
子函数for (i:0->100), 求blist;
子函数for (j:0->100), 求 bMax;

对于每次数据改变
Function DataChange:
把changeData 分为符合上面小区域的多个集合 listData:(每个listData[k] 都包含在 只有一个 aList[i] 对象中)。
改变 aList[i] 对象。

aList[i] 对象改变事件
Function AChanged(IList changedData)
判断changedData 是否覆盖 对应 bList[i]中坐标
1. 部分与未覆盖:求 max(bList[i], changedData)
2. 全部覆盖:求 max(aList[i])

如果bList[i] 改变,重复子函数
for (j:0->100), 求 bMax;

------解决方案--------------------
二维数组就是一维数组的集合,所以你将他看成复杂的一维数组进行处理,这样就能用一些一维数组的高效的处理方法了。
------解决方案--------------------
从一堆数中取最大值,没有别的办法,只能挨个比较。
------解决方案--------------------
换个角度你看可以吗
   //最大值外坐标
    class MaxItem {
        
        private int x;
        private int y;
        public MaxItem(int x, int y)
        {
            this.x = x;
            this.y = y;            
        }     
        public int X { get { return x; } }