找一个数组最大值算法
一个2维数组,数字有大有小,数值会有重复
假设
int[,] XY; 大小 500*500
需要追踪最大值[]以及所在位置[] 比如 99 在 200,255 和 300,100
二位数组的,某个部份会改变 比如 位置 40,200 ,长 20,宽 30 的一个区域,里面的数值 会一次改变
想在每次改变后,继续能够方便的追踪整个2维数组最大值以及所在位置
求一高效算法,提示代码都欢迎
算法
[解决办法]
表示语文学的不好,不能完全理解你的问题~
[解决办法]
目前想到的还是循环。
第一次是在初如化时处理吧。
后面是其它小区域变化,那数据很少,如果变化区域出现了比最大数据还大的,就把最大数据更新,以后的变化类似。
[解决办法]
可以把二维数组看成一个平面
对这个平面划分成M 行 N列个小的区域
每个区域保存一个最大值
根据变化区域算出 小区域变化的集合,
更新这些小区域的最大值
再找区域间的最值
[解决办法]
//最大值外坐标
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));
}
}