- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我编写了一个程序,使用 A* 算法来解决 N-Puzzle。该算法运行完美,但与针对同一问题使用相同算法的所有程序相比,它似乎要慢得多。我认为减慢我的代码的部分是检查新节点是否存在于打开和关闭列表中。本质上,我正在做的是检查特定节点的整个值数组,每个节点都存储在 Closed 和 Open 列表中。这是我认为导致速度变慢的代码片段。
for(auto temp_Node:Neighbours(process))
{
auto pred = [temp_Node](Node* item) //lambda Expression for 'pred', custom comparator
{
bool value=true;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
if(item->Grid[i][j]!=temp_Node->Grid[i][j])
{
value=false;
break;
}
}
if(item->g!=temp_Node->g)
value=false;
return value;
};
if(find_if(begin(closed_list),end(closed_list), pred)==end(closed_list))
{
auto open_list_cpy=find_if(begin(open_list),end(open_list), pred);
if(open_list_cpy==open_list.end())
{
open_list.insert(temp_Node);
}
如您所见,我将 lambda 表达式与 find_if 结合使用来检查每个节点中的所有值。
我想知道我是否遗漏了什么,或者是否有任何其他更有效的方法来解决这个问题,或者这是应该如何完成并且我的代码的其他部分有问题?
最佳答案
您可能希望使用网格保留一个 map
或 set
节点以进行比较,而不是按顺序搜索所有节点:
struct GridLess {
bool operator()(const Node *a,const Node *b) const
{
assert(a);
assert(b);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(a->Grid[i][j]!=b->Grid[i][j])
{
return a->Grid[i][j] < b->Grid[i][j];
}
}
}
return false;
}
};
std::set<Node*,GridLess> closed_list;
现在你可以使用
if (closed_list.count(temp_Node)==0) {
// No node in closed_list has the same grid as temp_node
}
这将时间复杂度从 O(n) 降低到 O(log(n))。
关于algorithm - 使用 A-star 优化 N-Puzzle 上的重复节点搜索(封闭列表、开放列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35397306/
以下是来自Interviewstreet的问题我没有从他们的网站上得到任何帮助,所以在这里提问。我对算法/解决方案不感兴趣,但我不理解他们作为第二个输入示例给出的解决方案。任何人都可以帮助我理解问题陈
根据我的理解,创建一个可解决的滑动拼图必须遵循以下规则: A. If the grid width is odd, then the number of inversions in a solvabl
我编写了一系列函数来尝试解决 N 难题/8 难题。 我对自己处理拼图的能力感到非常满意,但在如何迭代和找到最佳路径方面苦苦挣扎。我的技能也不是 OOP,所以功能很简单。 这个想法显然是为了减少 her
我有些摩尔斯电码丢失了字母之间的空格,我的挑战是找出消息中所说的内容。到目前为止,由于可能存在大量的组合,我有点迷失了。 这是关于我收到的消息的所有信息。 输出将为英语 总是会有有意义的翻译 这是示例
如果我知道,变量 a,b,c,d,e 有多少可能的组合: a+b+c+d+e = 500 并且它们都是整数且 >= 0,所以我知道它们是有限的。 最佳答案 @Torlack、@Jason Cohen:
检查 n 的数组是否整数包含 3 个可以形成三角形的数字(即两个数字中任何一个的总和大于第三个)。 显然,这可以在 O(n) 中完成。时间。 (明显的 O(n log n) 解决方案是对数组进行排序,
我有兴趣实现 14-15 puzzle : 我正在创建一个值 0 - 15 按递增顺序排列的数组: S = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
Closed. This question is off-topic。它当前不接受答案。 想要改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。 已关闭
所以,我对数独游戏的生成做了大量的阅读。据我所知,获得所需难度的数独谜题的标准方法是生成一个谜题,然后对其进行评分,然后重复,直到获得可接受的评分。这可以通过使用一些更复杂的求解模式(XY-wing、
如何混合两个ARGB像素? 例 在这里,A是(带有Alpha的红色),而B是(带有Alpha的蓝色)。 最佳答案 取自获得图像的同一Wikipedia文章: 转换为介于0到255之间的值: rOut
Closed. This question is off-topic。它当前不接受答案。 想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。 已关闭8
Joel 在他的 Guerrilla Guide to Interviewing 中提到计算一个字节中设置位的数量是一个编程问题。 ,并谈到了一种利用查找表中出现的模式的方法。在我发现这种模式后不久,
我在做一些回顾时遇到了这个报告的面试问题(以下引用是我找到的关于这个问题的所有信息): Given a function for a fair coin, write a function for a
我遇到了这个问题:说给定两个权重1和3,您可以权衡1,2(乘以3-1),3,4(乘以3 + 1)(使用平衡的两面)。现在找到最小的砝码数量,以便可以测量1到1000。 答案是1,3,9,27 ...
Locked. This question and its answers are locked因为该问题是题外话,但具有历史意义。它当前不接受新的答案或互动。 我使用这些规则制作了最终的笑声发生器。
左边是布局的正常状态。右边是布局的展开状态。 我的问题是我不知道如何让粉色框在它们的单元格中居中,并且随着布局向任何方向增长,粉色框之间的绿线连接起来。 只有这两个 View 的 AutoSizing
考虑以下代码: template struct S { }; template struct B; template class C> struct B> { void f() { } };
问题: 编写一个程序来删除出现在“所有”字符串中的片段,其中一个片段是 3 个或更多个连续的单词。 示例: 输入: s1 = "正在下雨,我想开车回家。"; s2 = "下雨了,我想去滑雪。"; s3
请检查以下程序。 #include struct st { int a ; } fn () { struct st obj ; obj.a = 10 ; return obj ; } int
我一直在研究这个 Prolog 逻辑问题。它得到了不正确的结果,运行程序本身需要一段时间,这是我更关心的。逻辑问题如下: Alex, Bret, Chris, Derek, Eddie, Fred,
我是一名优秀的程序员,十分优秀!