读书人

觅一个数组最大值算法

发布时间: 2013-04-26 16:27:53 作者: rapoo

找一个数组最大值算法
一个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; } }


public int Y { get { return y; } }

}
//自定义数组
class CArry : IEnumerable<int>
{
private int[,] m_Arr;
//最大值的组
private List<MaxItem> m_MaxItems;
private int m_MaxValue;
private int m_X, m_Y;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="x">x长度</param>
/// <param name="y">y长度</param>
public CArry(int x, int y)
{
m_Arr = new int[x, y];
m_X = x;
m_Y = y;
m_MaxItems = new List<MaxItem>();
m_MaxValue = 0;
}
public int XLength { get { return m_X; } }
public int YLength { get { return m_Y; } }

public int this[int x, int y]
{
get
{

if ((x >= m_X)
[解决办法]
(y >= m_Y))
throw new IndexOutOfRangeException("索引超出了数组界限。");
return m_Arr[x, y];
}
set {
if ((x >= m_X)
[解决办法]
(y >= m_Y))
throw new IndexOutOfRangeException("索引超出了数组界限。");
orderByValue(x, y, value);
}



}

public IList<MaxItem> MaxItems()
{
return m_MaxItems;
}
//这个区间周围怎么变就怎么变
private void orderByValue(int x, int y, int value)
{
//m_MaxItems m_MaxValue这里运算
}
//IEnumerable<int> 成员


[解决办法]
 //这个区间周围怎么变就怎么变
private void orderByValue(int x, int y, int value)
{
//m_MaxItems m_MaxValue这里运算
if (m_MaxValue > value)
{
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);
if (item >-1)
{
m_MaxItems.RemoveAt(item);
}
m_Arr[x, y] = value;
}
else if (m_MaxValue == value)
{
m_Arr[x, y] = value;
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);
m_MaxItems.Add(new MaxItem(x, y));
}
else
{
m_MaxValue = value;
m_MaxItems.Clear();
m_Arr[x, y] = value;
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);


m_MaxItems.Add(new MaxItem(x, y));

}
}


[解决办法]
第一次更改之前遍历整个数组找到最大的
每次更改子块时,将当前的最大值与子块逐项比较,若子块中有新的,则更新最大值及其位置,反之只更新子块值,最大值不变
[解决办法]
引用:
第一次更改之前遍历整个数组找到最大的
每次更改子块时,将当前的最大值与子块逐项比较,若子块中有新的,则更新最大值及其位置,反之只更新子块值,最大值不变


若子块中有新的最大值

[解决办法]
引用:
引用:目前想到的还是循环。
第一次是在初如化时处理吧。
后面是其它小区域变化,那数据很少,如果变化区域出现了比最大数据还大的,就把最大数据更新,以后的变化类似。

最大数据,可能就在 那个区域,区域里的变更可能会受到影响整个结构,最大值,次最大值


是啊。如果区域内受影响了,他存在比当前最大值还要大了,那么,刷新最大值数据就可以了。
也就是你循环的永远都是变化的那个小区域,只有初始化是才找大区域。

读书人网 >C#

热点推荐