以下函数接受三个单词对象,并检查每个单词的字母坐标(在表格中)。我们的想法是从列表中获得没有交叉字母坐标的三个单词的组合。但是,当您有超过600000种可能的组合时,这将变得非常耗时。
bool lettersIntersect(word one, word two, word three)
{
for(int i = 0; i < one.getLength(); i++)
for(int j = 0; j < two.getLength(); j++)
if(one.getLetterPosition(i).x == two.getLetterPosition(j).x && one.getLetterPosition(i).y == two.getLetterPosition(j).y)
return true;
for(int i = 0; i < two.getLength(); i++)
for(int j = 0; j < three.getLength(); j++)
if(two.getLetterPosition(i).x == three.getLetterPosition(j).x && two.getLetterPosition(i).y == three.getLetterPosition(j).y)
return true;
for(int i = 0; i < three.getLength(); i++)
for(int j = 0; j < one.getLength(); j++)
if(three.getLetterPosition(i).x == one.getLetterPosition(j).x && three.getLetterPosition(i).y == one.getLetterPosition(j).y)
return true;
return false;
}
有更有效的方法吗?
答案 0 :(得分:1)
我可以给你一个暗示立即打击我的提示。如果它具有误导性,请不要怪我。您可以在最后尝试一次并查看效果。
为每个单词对象创建地图(使用stl),例如map_one
,map_two
和map_three
将坐标值作为给定单词对象的每个字母的键添加到其相应的地图。
然后使用这些地图检查是否有交叉点。 Check if map in C++ contains all the keys from another map
答案 1 :(得分:0)
我认为唯一可以优化的是避免双重检查:
for(int i = 0; i < one.getLength(); i++)
for(int j = i+1; j < two.getLength(); j++)
if(one.getLetterPosition(i).x == two.getLetterPosition(j).x && one.getLetterPosition(i).y == two.getLetterPosition(j).y)
return true;
第二个for循环从j = 0变为j = i + 1,这使得你可以在一半的时间内完成检查。
在两个坐标点之间进行检查是一个n ^ 2(n-square)问题,这意味着进行检查所需的时间与您可以检查的元素数量的平方成正比。我觉得除了避免双重检查之外没有别的方法来优化这个,就像我解释的那样。
当然,除了通过引用之外,就像你已经建议的那样。
答案 2 :(得分:0)
在此作业问题或其他学习练习中,您打算使用之前教过的方法重新排列数据以加快搜索速度。重新排列数据后,您应该能够找到一种方法来有效地扫描数据以查找重复数据。