我正在寻找一种算法来在合理的时间内解决以下问题.
给定一组集合,找到作为给定集合的子集的所有这样的集合.
例如,如果您有一组搜索术语,如["堆栈溢出","foo bar",...],则给定文档D,找到所有搜索词,其所有词都出现在D.
我找到了两个足够的解决方案:
使用位向量列表作为索引.要查询给定超集,请为其创建位向量,然后迭代列表,对列表中的每个向量执行按位OR运算.如果结果等于搜索矢量,则搜索集是由当前矢量表示的集合的超集.该算法的O(n)位置n是索引中的集合数,而按位OR非常快.插入是O(1).警告:为了支持英语中的所有单词,位向量需要数百万位长,并且需要存在单词的总顺序,没有间隙.
使用前缀树(trie).在将它们插入到trie之前对它们进行排序.搜索给定集时,请先对其进行排序.迭代搜索集的元素,激活匹配的节点,如果它们是根节点的子节点或先前激活的节点的子节点.通过激活节点到叶子的所有路径表示搜索集的子集.该算法的复杂性O(a log a + ab),其中a是搜索集的大小和b被索引集的数目.
你的解决方案是什么?
我知道Scala的列表有一个带签名的map实现和带签名(f: (A) => B):List[B]的foreach实现,(f: (A) => Unit):Unit但我正在寻找接受多个iterables的东西,就像Python map接受多个iterables一样.
我正在寻找具有特征(f: (A,B) => C, Iterable[A], Iterable[B] ):Iterable[C]或同等特征的东西.是否存在存在这样的库或类似的类似方法?
编辑:
如下所示,我可以做到
val output = myList zip( otherList ) map( x => x(0) + x(1) )
Run Code Online (Sandbox Code Playgroud)
但这会在两个步骤之间创建一个临时列表.如果评论员会发帖,我可以赞成他(提示,提示),但还有另一种方式吗?
我已经获得了一个java api,用于通过基于回调的样式连接和通过专用总线进行通信.我目前正在scala中实现一个概念验证应用程序,我正在尝试研究如何生成一个稍微更惯用的scala接口.
典型(简化)应用程序在Java中可能看起来像这样:
DataType type = new DataType();
BusConnector con = new BusConnector();
con.waitForData(type.getClass()).addListener(new IListener<DataType>() {
public void onEvent(DataType t) {
//some stuff happens in here, and then we need some more data
con.waitForData(anotherType.getClass()).addListener(new IListener<anotherType>() {
public void onEvent(anotherType t) {
//we do more stuff in here, and so on
}
});
}
});
//now we've got the behaviours set up we call
con.start();
Run Code Online (Sandbox Code Playgroud)
在scala中,我可以明确地定义从(T => Unit)到IListener的隐式转换,这肯定会使事情变得更简单:
implicit def func2Ilistener[T](f: (T => Unit)) : IListener[T] = new IListener[T]{
def onEvent(t:T) …Run Code Online (Sandbox Code Playgroud) 在Java中,是否有可能强制某个类具有一组特定的子类而没有其他子类?例如:
public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式强制执行不能创建A的其他子类吗?
我试图通过实现一个描述monad的非常基本的接口来掌握scala中的高阶多态性,但我遇到了一个我不太了解的问题.
我用C++实现了相同的代码,代码如下所示:
#include <iostream>
template <typename T>
class Value {
private:
T value;
public:
Value(const T& t) {
this->value = t;
}
T get() {
return this->value;
}
};
template < template <typename> class Container >
class Monad {
public:
template <typename A> Container<A> pure(const A& a);
};
template <template <typename> class Container>
template <typename A>
Container<A> Monad<Container>::pure(const A& a) {
return Container<A>(a);
}
int main() {
Monad<Value> m;
std::cout << m.pure(1).get() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当尝试使用scala执行相同操作时,我失败了:
class Value[T](val …Run Code Online (Sandbox Code Playgroud) 今天早上,我尝试对Subversion进行修订,发现突然间我没有这样做的许可.
Can't move '/svn/db/txn-protorevs/21000-ga9.rev' to '/svn/db/revs/21/21001': Permission Denied
看一下revs目录,我注意到有人提交了第21000个修订版,并且由于某种原因缺少新目录的组写权限.
drwxrwsr-x 2 svn svn 24K 2008-10-27 10:04 19
drwxrwsr-x 2 svn svn 24K 2008-12-18 07:13 20
drwxr-sr-x 2 jeff svn 4.0K 2008-12-18 11:18 21
在该目录上设置组写权限允许我提交,所以我很适合另外1000个修订.但为什么会发生这种情况,我可以改变什么以确保它不会再发生?
我想发出如下的查询
select max(col1), f(:1, col2) from t group by f(:1, col2)
Run Code Online (Sandbox Code Playgroud)
哪里:1是绑定变量.使用PreparedStatement,如果我说
connection.prepareStatement
("select max(col1), f(?, col2) from t group by f(?, col2)")
Run Code Online (Sandbox Code Playgroud)
我收到DBMS抱怨的错误,f(?, col2)它不是GROUP BY表达式.
如何通常在JDBC中解决这个问题?
嗨,我正在研究高级Scala书,我在使用scalaz源代码中修改这段代码时遇到了一些麻烦:
object Tag {
/** `subst` specialized to `Id`.
*
* @todo According to Miles, @specialized doesn't help here. Maybe manually specialize.
*/
@inline def apply[@specialized A, T](a: A): A @@ T = a.asInstanceOf[A @@ T]
// ...
}
Run Code Online (Sandbox Code Playgroud)
它怎么样?a.asInstanceOf[A @@ T]不应该用ClassCastException失败吗?
使用的一个例子是:
Multiplication(2) |+| Multiplication(3)
Run Code Online (Sandbox Code Playgroud)
在这种情况下a是一个Int如何将它转换为@@[Int, Multiplication](Tagged[Int, Multiplication])
谢谢您的帮助.
我正在尝试编写一个函数,该函数接受一个Int并返回直到该Int的所有素数。
例如“ 8的素数列表” = List(3,5,7)
这是我到目前为止所拥有的:
def isPrime(i: Int): Boolean = {
if (i <= 1)
false
else if (i == 2)
true
else
!(2 to (i - 1)).exists(x => i % x == 0)
} //> isPrime: (i: Int)Boolean
def getListOfPrimesToN(n : Int) = {
}
Run Code Online (Sandbox Code Playgroud)
对于功能getListOfPrimesToN,我打算1.创建一个大小为n的列表“ l”,并使用介于0到n之间的元素填充它。2.调用“ l”的映射函数,并为List中的每个元素调用isPrime。
如何创建元素1到N的列表?
用于返回所有质数直至(包括Int N)欢迎数的任何其他解决方案。
假设我想搜索类型类似于 的函数[k] -> Set k。我正在尝试使用findUCM 的命令,但这只能让我按名称搜索。如果我知道我正在寻找的函数的名称,我就不必搜索它
有类似 Haskell 的Hoogle 的东西吗?