这是一个数学问题,因为它正在寻找一个算法/数学函数,然后我可以用Java实现,然后再用C ++实现。我不确定甚至要搜索什么,但我已经尝试过了,所以指向我的方向更好的方向,甚至是非常好的。
所以我开始使用 [0 - n] 中的任意长度集(在我的程序中存储为数组,但这没关系)以及我正在尝试的do是弄清楚一些数学公式(或只是伪代码算法)将扩展/缩小设置为一定长度,而 0 保持不变,但 n 更改为一组数字,以及某种方式“扩展”或“收缩”之间的数字。我猜这与调整图像大小相似,但这不是我正在做的事情。
示例1: 初始数组是array.length() 1936 ,我正在尝试将其扩展为 22,000 ,同时保持 0 和以一种合理的方式扩展数字(它不需要是完美的,只是合理的)
示例2: 初始数组是array.length() 27,002 ,所以在维护 0 和以某种合理的方式在收缩期间对数字进行排序。
我不知道我正在寻找的数学术语是什么,或者在实际甚至伪代码中实现它是多么容易/困难。非常感谢帮助搜索什么!谢谢!
修改
这是我最终根据@ Dukeling的建议做出的解决方案,显然在几个地方会有精确度的损失,但我并不是因为我写这个目的而过分担心,也许是因为测试版或更高版本,但现在不是(例如Java):
public class NumberTest
{
public static void main(String[] args)
{
int count;
double temp;
int goal = 20000;
int before = 5029;
int[] beforeList = new int[before];
int[] afterList = new int[goal];
for (count = 0; count < before; count++)
// this populates the initial array
{
beforeList[count] = count;
}
for (count = 0; count < before; count++)
// this creates the resulting set
{
temp = (double)beforeList[count]/(double)before * (double)goal;
afterList[count] = (int)temp;
}
}
}
这将创建两个列表,一个设置为[1-n],其中int'before'为n,另一个(基于此),其中'goal'的近似值是最大的#。
我不确定在处理和/或记忆方面是否有“更便宜”的方法来做到这一点,但这是迄今为止我能想到的最好的方法,并且应该或多或少地解释我的意思试图做。
答案 0 :(得分:0)
如果我理解正确,您希望保持每个数字的比率与最大值。
为此,您需要基本上为每个数字将该数字除以oldN
并将其乘以newN
。
因此,将0,2,4,5
(即0-5
范围内)扩展为0-20
将成为
0/5*20, 2/5*20, 4/5*20, 5/5*20
= 0,8,16,20
。
答案 1 :(得分:0)
(由于OP后来对该问题的评论而修订)
问题似乎是将范围n1
中的一组[low1 .. hi1]
整数映射到n2
范围内的另一组大小[low2 .. hi2]
。这似乎相当于在点(low1,low2)
和(hi1,hi2)
之间的平面上找到最佳线,其中人们只能使用整数来定义线上点的位置。这样做的好方法是使用Bresenham algorithm。
如果n2 < n1
,则生成的整数列表将具有重复项,从列表创建集合时将删除这些重复项。