我正在尝试散列值
10, 100, 32, 45, 58, 126, 3, 29, 200, 400, 0
Run Code Online (Sandbox Code Playgroud)
我需要一个函数,将它们映射到一个大小为13的数组,而不会导致任何冲突.
我花了几个小时思考这个并用谷歌搜索,无法解决这个问题.我还没有接近可行的解决方案.
我将如何找到这种哈希函数?我玩过gperf,但我真的不明白它,我无法得到我想要的结果.
在学习python的基本编程时,我找到了web.py. 我遇到了一个愚蠢的问题:
我写了一个简单的控制台应用程序,其主循环在单独的线程中从队列中截取项目.我的目标是使用web.py将项目添加到我的队列,并通过Web请求报告队列的状态.我把它作为模块运行,但无法将其集成到我的主应用程序中.我的问题是,当我用app.run()启动http服务器时,它会阻止我的主循环.还试图用thread.start_new_thread启动它,但它仍然阻止.有一种简单的方法可以在我的应用程序中在后台运行web.py的集成http服务器.
在可能的情况下,我是一个基本的误解的受害者,任何澄清我的推理错误的尝试都会有所帮助;.)(请耐心等待我,我是初学者:-)
我可以看到两种实现let绑定的方法.首先,如从SICP所知,let可以实现为lambda函数.这是方便和简单的,但考虑到每个lambda(fn)在JVM中被转换为单独的类并且let在平均程序中使用的次数这一事实,这看起来非常非常昂贵.
其次,let绑定可以直接转换为本地Java变量.这会产生很少的开销,但是在堆栈上存储绑定会破坏语言语义:在这种情况下,创建闭包是不可能的 - 保存的值将在堆栈展开后立即销毁.
那么Clojure中使用的实际实现是什么?指出Clojure源中的相应行是值得赞赏的.
维基百科关于AVL树的文章的第三段说:"由于AVL树更加严格平衡,因此对于查找密集型应用程序来说,它们比红黑树更快."
因此,不应该使用AVL树而不是红黑树来实现TreeMap(因为基于散列的数据结构会有更多的查找密集型应用程序)?
如何检查C++类型是否可以轻易复制?我有一个类,它使用具有指定模板类型T的memcpy和memcmp函数,我想为类型启动断言,使用memcpy复制是不安全的.有没有办法(使用现有标准)?
在性能方面,消息传递并发方案和基于锁的并发方案之间究竟有什么区别?正在等待锁定的线程阻塞,因此其他线程可以运行.因此,我没有看到消息传递如何比基于锁的并发更快.
编辑:具体来说,我正在讨论像Erlang中的消息传递方法,与使用锁(或原子操作)的共享数据方法相比.
也许有一个简单的方法,我没有看到,所以希望有人可以向我解释.
假设我有一节课:
class A {
public:
const double parameter;
const std::string name;
const std:: string fileName;
A(const double parameter, const std::string name, const std::string fileName) :
parameter(parameter), name(name), fileName(fileName) {};
};
Run Code Online (Sandbox Code Playgroud)
那个类的生成器是:
class AReader {
public:
ifstream dataFile;
AReader(const std::string filename);
A* readObject(const std::string objectName);
};
Run Code Online (Sandbox Code Playgroud)
我想boost::flyweight用来处理这些A对象,因为它们可能有数百万个引用,实际上它们包含大量数据.他们将在哈希name和fileName在一起.
我需要做什么才能做到这一点?我需要boost::flyweight调用AReader.readObject并散列/存储生成的A类.
是否AReader需要成为一个完整的工厂并用作定制工厂?或者是否可以使用flyweight中的默认工厂并以某种方式用于AReader生成A实例(而不是实现工厂所需的整个存储模式),可能通过使AReader实例成为flyweight中的某个参数?或者是否可以const从外部数据源获取公共变量(即,一旦设置,它们不会更改)而无需诉诸第二类?
编辑
我也对不使用Boost的其他建议持开放态度.我当然可以编写我自己的flyweight实现,或任何其他模式,如果一个更适合.但如果我可以使用已经存在的东西,那将是最好的.无论什么最小化我需要编写的代码量,因为一如既往,截止日期很短.
我有一个表foo(包括其他20个)列bar,baz并且quux索引为baz和quux.该表有~500k行.
为什么以下查询的速度差异如此之大?查询A需要0.3秒,而查询B需要28秒.
查询A.
select baz from foo
where bar = :bar
and quux = (select quux from foo where bar = :bar order by quux desc limit 1)
Run Code Online (Sandbox Code Playgroud)
说明
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo index NULL quuxIdx 9 NULL 1 "Using where"
Run Code Online (Sandbox Code Playgroud)
查询B.
select baz from foo
where bar …Run Code Online (Sandbox Code Playgroud) 我有两个值,t1并且t2,类型的Either String Type.该Left-value用于错误处理.这些值用于返回的函数中Either String Type.
我想要做的是检查是否都t1和t2都Right-值和满足p :: Type -> Bool.如果他们这样做,我想回来Right (the type inside t1).如果这两个t1和t2是Right-值,但不能满足p,我要回Left someString.如果其中一个t1或是t2一个Left值,我只想传递该值.
我怎样才能以优雅的方式做到这一点?我有一种预感,使用Either作为monad是正确的做法,但我不确定如何去做.
我正在为Haskell中的简单命令式语言编写编译器,输出Java字节码.我已经到了我发出字节码的抽象表示的地步.
在编写用于编译if语句的代码时遇到了一些麻烦.要实现if语句,我需要跳转到标签.因此,我需要为该标签生成一个名称,该名称必须是唯一的.
我的第一个想法是通过一些状态compileStatement,即
compileStatement :: Statement -> UniqueIDState -> [AbstractInstruction]
Run Code Online (Sandbox Code Playgroud)
当然,compilerStatement是递归的,所以使用这种方法需要我从递归调用中将唯一ID生成器的状态传递回upp:
compileStatement :: Statement -> UniqueIDState -> (UniqueIdState, [AbstractInstruction])
Run Code Online (Sandbox Code Playgroud)
这看起来有点笨拙,特别是如果我意识到我需要在将来携带更多状态; 有更优雅的方式吗?
c++ ×2
haskell ×2
performance ×2
algorithm ×1
avl-tree ×1
boost ×1
clojure ×1
concurrency ×1
either ×1
hash ×1
hashtable ×1
java ×1
let ×1
memcmp ×1
memcpy ×1
monads ×1
mysql ×1
perfect-hash ×1
python ×1
type-traits ×1
visual-c++ ×1
web-services ×1
web.py ×1