小编Hep*_*tic的帖子

检查表达式树的可满足性

我正在尝试寻找解决问题的实用方法(例如在工程方面的努力),其中我有一堆未知值:

val a: Int32 = ???
val c: Int32 = ???
val d: Bool = ???
Run Code Online (Sandbox Code Playgroud)

和表达式二进制树(在内存中),最终返回一个布尔值,例如

((a > 4) || (b == (c+2))) && (a < b) && ((2*d)) || e
Run Code Online (Sandbox Code Playgroud)

我有的布尔运算符and or xor not和32位整数有比较的东西,以及加法,乘法,除法(注意:这些必须尊重32位溢出!)以及一些按位的东西(移位,按位&,| ^).但是,我不一定需要支持所有这些操作[参见:LOL_NO_IDEA]

我想得到三个答案中的一个:

  • ES_POSSIBLE [我不需要知道如何,只是被告知它有可能存在的方式]
  • 不可能[无论我的变量保持什么值,这个方程永远不会是真的]
  • LOL_NO_IDEA [如果问题太复杂或耗时,这是可以接受的]

我正在解决的问题都不是太大或太复杂,而且条款太多(最多的是大约数百个).并且有大量的LOL_NO_IDEA可以.然而,我正在解决数以百万计的这些问题,因此不断的成本将会刺痛(例如转换为文本格式,并唤起外部解算器)

因为我是用scala做的,所以使用SAT4J看起来非常吸引人.虽然,文档很糟糕(特别是像我这样的人,他们只关注这个SAT世界几天)

但我目前的想法是,首先将每个Int32变为32个布尔值.这样我可以通过将它作为嵌套布尔表达式来表达像(a <b)这样的关系(比较msb,如果它们是eq,那么下一个等等)

然后当我有一个布尔变量和布尔表达式的大表达式树时 - 然后遍历它,同时逐步建立一个:http: //en.wikipedia.org/wiki/Conjunctive_normal_form

然后将其喂入SAT4J.

然而,所有这些看起来都非常具有挑战性 - 甚至构建CNF似乎效率很低(以天真的方式做,我实现它)并且容易出错.更不用说尝试将所有整数数学编码为布尔表达式.而且我无法为像我这样的人找到好的资源,一个想要使用SAT解决问题的工程师主要是一个黑盒子

我很感激任何反馈,即使它像"哈哈,你的白痴 - 看看X"或"是的,你的想法是正确的.享受!"

scala artificial-intelligence satisfiability conjunctive-normal-form

4
推荐指数
1
解决办法
766
查看次数

有效地对mongodb地理空间查询的结果进行排序

我有一大堆文件,如:

{ loc: [10.32, 24.34], relevance: 0.434 }
Run Code Online (Sandbox Code Playgroud)

并希望能够有效地执行以下查询:

 { "loc": {"$geoWithin":{"$box":[[-103,10.1],[-80.43,30.232]]}} }
Run Code Online (Sandbox Code Playgroud)

随意的盒子.

添加2d索引loc使得这非常快速和有效.但是,我现在也想获得最相关的文件:

.sort({ relevance: -1 })
Run Code Online (Sandbox Code Playgroud)

这导致一切都被抓到了(在任何特定的盒子里都会有大量的结果,而我只需要前10名左右).

任何建议或帮助非常感谢!!

mongodb

4
推荐指数
1
解决办法
1204
查看次数

Postgres动态创建监听器

我有一个网站,由postgres数据库支持.有多个Web服务器,它们维护与每个客户端的持久连接,并需要通知它们相关事件.来自一个Web服务器的更改可能会影响连接到另一个Web服务器的用户,因此我需要Web服务器之间的一些消息传递层.理想情况下,我想使用数据库来保持简单.

所以我看到的两个显而易见的方法是:

1)让网络服务器监听所有事件,并且网络服务器端过滤那些对它有用的事件(例如,与它当前有连接的用户有关).

要么:

2)为每个连接客户端动态创建一个监听器,并在客户端断开连接时删除监听器.

第一种方式意味着很多无用的数据通过网络,但网络服务器很容易过滤(一个简单的hashmap查找).第二种方式看起来很理想,如果 postgres以这样的方式实现,即我可以随时创建数千(至数万)的侦听器.

顺便说一下,我正在使用最新版本的postgres

思考?

非常感谢!

postgresql node.js

4
推荐指数
1
解决办法
697
查看次数

使用boost :: bind的std :: foreach

这有什么问题:

template <typename T>
std::list<T> & operator+=(std::list<T> & first, std::list<T> const& second)
{
    std::for_each(second.begin(), second.end(), boost::bind(&std::list<T>::push_back, first, _1));

    return first;
}
Run Code Online (Sandbox Code Playgroud)

编译很好,但不起作用.

c++ stl boost-bind

3
推荐指数
2
解决办法
2275
查看次数

Haskell尾递归可预测性

我使用haskell的一个最大问题是能够(正确地)预测haskell代码的性能.虽然我遇到了一些更难的问题,但我发现自己几乎没有理解.

采取这样简单的事情:

count [] = 0
count (x:xs) = 1 + count xs 
Run Code Online (Sandbox Code Playgroud)

据我了解,这不是严格的尾部调用(它应该在堆栈上保持1),所以看看这个定义 - 我能解释什么呢?计数函数显然应该有O(1)空间要求,但是这个是吗?我可以保证会不会或不会?

optimization haskell

1
推荐指数
1
解决办法
306
查看次数

非常简单的Javascript继承

我需要在JavaScript中使用超级简单继承的超级可读版本.这是一些自动生成的代码,我无法使用外部函数或库.

我真正想要的是,假设Point3d"继承"Point,我想要这样的东西:

function Point(x,y) {
  this.x = x;
  this.y = y;
}

function Point3d(x,y,z) {
  Point(x, y);
  this.z = z;
}
Run Code Online (Sandbox Code Playgroud)

除了它实际上没有工作:

var pt = new Point3d(230,30,11);
// but x and y are in global scope, they should be in pt.x and pt.y :(
Run Code Online (Sandbox Code Playgroud)

一个可能的选择,在代码生成中会复制所有成员 - 但由于Javascript是基于原型的,我想这很容易做到(如果我真的知道Javascript)

谢谢

javascript prototype

1
推荐指数
1
解决办法
197
查看次数