如果我实现了仅使用一种哈希算法(例如杂音)的布隆过滤器,这是否仍被视为布隆过滤器?
例如,如果import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class SSCCE extends JPanel
{
private DefaultTableModel model;
SSCCE()
{
setLayout( new BorderLayout() );
model = new DefaultTableModel(0, 2);
JTable table = new JTable( model );
add(new JScrollPane( table ));
JButton button = new JButton( "Add Row" );
add(button, BorderLayout.PAGE_END);
button.addActionListener( new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Vector<Object> row = new Vector<Object>();
row.add( "" + model.getRowCount() );
row.add( new Date().toString() );
model.addRow( row );
}
});
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
散列为a
,则将设置过滤器的第5位。如果5
散列为b
,则将设置过滤器的位1,依此类推...
对于某种被视为布隆过滤器的东西,是否必须在过滤器中至少设置两位?如果只设置了一位,它还会被称为其他吗?
答案 0 :(得分:0)
它仍然是布隆过滤器:带有k=1
的过滤器。根据每个元素的位数,它可能不是最节省空间的。但是,出于各种原因,人们可能会选择不是k
的{{1}},主要是:
round(bitsPerKey * log(2))
的Bloom过滤器。另请参阅Michael Mitzenmacher的论文"Compressed Bloom Filters"。k=1
。顺便说一句,即使您仅使用一个“应用程序散列函数”(例如具有64位的Murmur散列),仍然可以选择k
来节省空间。您只需选择“ Bloom散列函数”作为此“应用程序散列函数”(64位Murmur散列)的函数,就像这样(假设k
是32位,而int
是64位) :
long
实际上,这比计算多个“应用程序散列函数”要容易得多。从外观上看,像这样:
long m = murmur(x)
h(x, i) = (int) (m >> 32) + i * (int) m
许多Bloom过滤器库都这样做,例如Guava中的Bloom过滤器实现。