多维数组v。对多个数组进行排序

时间:2015-02-24 03:01:28

标签: c++ arrays multidimensional-array

我在C ++程序中继续工作时遇到了麻烦,我不确定解决问题的最佳方法是什么。以下是非编程术语的情况:我有一份儿童名单,每个孩子都有特定的体重,年龄和幸福感。我有一种方法,人们可以直观地查看特定于这些特征的孩子的骨头。 (想想一个MMO角色定制,其中每个特征都有滑块,当你将重量滑块滑动到重物时,步行循环看起来像角色更重)。

之前,我的系统为每个特征的每个频谱末端都设置了一个步行周期。例如,最重的步行有一个特定的步行周期,一个用于最轻的步行,一个用于最小的步行等。没有中间输入,输出是滑块在刻度上的位置和最重的步行周期和最轻的步行周期按特定百分比平均,即滑块的位置。

现在问题是,我有一个预设步行周期的大型库,每个步行周期都有特定的重量,年龄和快乐。因此,Joe的体重为4,年龄为7岁,幸福感为8,Sally为2,3,5。当滑块移动到特定值时(体重5,年龄8,幸福7)。但是,一次只能移动一个滑块,最后移动的滑块是找到最接近匹配的最重要特征。我想在我的图书馆中找到最接近这三个值的孩子,而Joe将是最接近的。

我被告知要使用3维数组进行检查,但我宁愿使用子对象数组并对该数组执行多次搜索,我是新手,我知道搜索会占用一些计算时间但是我一直倾向于使用单个阵列。我也可以使用二维数组,但我不确定。什么数据结构最适合搜索三个值?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

每个滑块可以使用多少个不同的值?如果每个滑块有十个值,则表示存在10 * 10 * 10 = 1000个不同的可能字符类。如果您的图书馆有不到1000个步行周期,只需通读它们,所有寻找最近的匹配可能会足够快。

当然,如果每个滑块有100个值,那么您可能想要更聪明的东西。我的观点是,有些事情不必优化。

您的步行周期库也是一劳永逸的吗?如果是这样,也许您可​​以为滑块的每个设置预先计算步行周期并将其写入静态数组。

答案 1 :(得分:1)

我同意Wilf的说法,步行周期的数量是至关重要的,因为即使有100,000个周期,你也可以轻松地使用蛮力找到最大值......

weight_factor * diff(candidate.weight, target.weight) +
age_factor * diff(candidate.age, target.age) +
happiness_factor * diff(candidate.happiness, target.happiness)

...最后移动的滑块的因子高于其他滑块。

对于更多的周期,你想要稍微限制搜索空间,并且一些索引会很有用,例如:

map<int, map< int, map<int, vector<Cycle*>> cycles_by_weight_age_happiness;

你可以填充将cycles[rw(weight)][ra(age)][rh(happiness)]rw和{{{ 1}}以您喜欢的任何粒度舍入参数(例如,圆形权重下降到最接近的5kgs,组年龄按日志基数1.5的整数部分,单独留下幸福)。然后搜索你评估你的目标{rw(重量),ra(年龄),rh(幸福)}指数“周围”的条目...你偏离的距离越远(特别是在最后一个滑块移动的参数,你不太可能找到比你已经看到的更合身的东西,所以要调整味道。

上面的索引是对Wilf意图的改进 - 只是使用函数将映射从值空间分离到索引中的向量。