扩展/缩小设置为特定长度的数字

时间:2013-12-09 22:54:46

标签: java arrays algorithm math pseudocode

这是一个数学问题,因为它正在寻找一个算法/数学函数,然后我可以用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'的近似值是最大的#。

我不确定在处理和/或记忆方面是否有“更便宜”的方法来做到这一点,但这是迄今为止我能想到的最好的方法,并且应该或多或少地解释我的意思试图做。

2 个答案:

答案 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,则生成的整数列表将具有重复项,从列表创建集合时将删除这些重复项。