我知道全文搜索的一个基本方面是使用倒排索引.因此,使用反向索引,单字查询变得微不足道.假设索引的结构如下:
some-word - > [doc385,doc211,doc39977,...](按等级排序,降序排序)
要回答该单词的查询,解决方案就是在索引中找到正确的条目(需要O(log n)时间)并从索引中指定的列表中显示一些给定数量的文档(例如前10个).
但是那些返回与两个单词相匹配的文档的查询呢?最直接的实现如下:
现在,第三步可能需要O(n log n)时间来执行.对于非常大的A和B,可能使查询缓慢回答.但像谷歌这样的搜索引擎总会在几毫秒内回复他们的答案.所以这不是完整的答案.
一个明显的优化是,由于像谷歌这样的搜索引擎无论如何都没有返回所有匹配的文档,我们不必计算整个交集.我们可以从最小的集合(例如B)开始,并找到足够的条目,这些条目也属于另一个集合(例如A).
但是,我们还不能有以下最糟糕的情况吗?如果我们设置A是与普通单词匹配的文档集,并且集合B是与另一个常用单词匹配的文档集,则可能仍然存在A∩B非常小的情况(即,组合很少).这意味着搜索引擎必须线性地遍历B的所有元素x成员,检查它们是否也是A的元素,以找到符合这两个条件的少数元素.
线性不快.并且您可以使用两个以上的单词进行搜索,因此仅使用并行性肯定不是整个解决方案.那么,这些案例如何优化?大型全文搜索引擎是否使用某种复合索引?布隆过滤器?有任何想法吗?
algorithm indexing search-engine full-text-indexing inverted-index
我试图在iPhone粘贴板中放入一些纯文本.以下代码似乎不起作用:
UIPasteboard *pboard = [UIPasteboard generalPasteboard];
NSString *value = @"test";
[pboard setValue: value forPasteboardType: @"public.plain-text"];
Run Code Online (Sandbox Code Playgroud)
我猜这个问题是在PasteBoard类型参数中.传递@"public.plain-text"什么也没有发生.传递kUTTypePlainText编译器抱怨指针类型不兼容,但不会崩溃,也没有任何反应.使用kUTTypePlainText似乎也需要链接MobileCoreServices,这在文档中没有提到.
试想一下,你有一大组#m具有属性的对象A和B.您可以使用哪种数据结构作为索引(或哪种算法)来提高以下查询的性能?
find all objects where A between X and Y, order by B, return first N results;
Run Code Online (Sandbox Code Playgroud)
也就是说,按范围过滤A并按排序B,但只返回前几个结果(例如,最多1000个).插入非常罕见,因此可以接受繁重的预处理.我不开心以下选项:
与由乙排序记录(或索引):扫描中的记录/索引B顺序,返回第一个N,其中A相匹配XY.在最糟糕的情况下(很少的对象匹配范围XY,或匹配位于记录/索引的末尾),这变得O(m)很大,对于大型数据集来说,这m不够好.
使用按A排序的记录(或索引):执行二进制搜索,直到找到与范围XY匹配的第一个对象.扫描并创建k与范围匹配的所有对象的引用数组.按B排序数组,返回第一个数组N.那是O(log m + k + k log k).如果k很小那么确实如此O(log m),但如果k很大则排序成本甚至比所有m对象的线性扫描成本更差.
自适应2/1:对范围XY的第一个匹配进行二分搜索(使用A上的索引); 对该范围的最后一个匹配进行二进制搜索.如果范围很小,继续算法2; 否则回到算法1.这里的问题是我们回到算法1的情况.虽然我们检查了"很多"对象通过过滤器,这是算法1的好例子,但这个"很多"最多是一个常量(渐渐地,O(n)扫描将总是胜过O(k log k)排序).所以我们仍然有O(n)一些算法用于某些查询.
是否有算法/数据结构允许在次线性时间内回答此查询?
如果没有,那么达到必要性能的好处是什么呢?例如,如果我不保证返回对象的最佳排名 …
由于大多数系统中的互斥锁是使用CAS操作实现的,因此我想知道这两种结构的性能比较.
可以公平地说,如果使用CAS实现互斥锁,那么对于CAS操作,该互斥锁上的try-lock调用将是相同/相似的性能吗?
CAS,高度依赖于系统,我在想是否可以用它的更为人熟知/标准化的派生,mutex try-lock来代替它.
我从 Chisel 3 源代码生成 Verilog,并使用 UCF 文件将 Verilog 的顶部模块端口映射到 FPGA 引脚。
我的设计中有一组输入输出引脚(SDRAM 数据引脚),在 Chisel 端必须将其表示为单独的输入和输出端口。问题是,我不能(AFAIK)然后将 Verilog 输入端口和输出端口映射到同一个 FPGA 引脚(如果我直接编写 Verilog,这些将是单个输入输出信号,因此这不会成为问题)并且我不知道如何强制 Chisel 3 从两个输入/输出 Chisel 端口生成单个 Verilog 输入输出端口。
Chisel (3) 中通常如何解决这个问题?
我有一个遗留数据库,其中包含文档和作者的表格.第三个表定义了文档和作者之间有序的多对多关系,使用文档和作者的外键以及指定给定文档的作者顺序的整数.
使用Django 1.1.1(或SVN),有没有办法在管理页面中编辑文档作者及其顺序?
这似乎在凿子2中有效,但现在不起作用:
class TestX extends Module
{
val io = IO(new Bundle {
val a = Output(UInt(width=2))
})
io.a(1, 0) := UInt(0)
}
Run Code Online (Sandbox Code Playgroud)
错误:[模块TestX]表达式T_4用作FEMALE,但只能用作MALE。
此更改的解决方法是什么?
algorithm ×2
chisel ×2
indexing ×2
c ×1
cocoa-touch ×1
copy-paste ×1
django ×1
django-admin ×1
ios ×1
mutex ×1
posix ×1
search ×1
uipasteboard ×1