刁肥宅数据结构课设“布隆过滤器的实践与应用”源代码(v1.0,永不上交)

Posted 25th-engineer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刁肥宅数据结构课设“布隆过滤器的实践与应用”源代码(v1.0,永不上交)相关的知识,希望对你有一定的参考价值。

       代码很简单,写了一些注释;加上注释看就很清楚了。

       文件bloomfilter.cpp:

  1 #include "bloomfilter.h"
  2 
  3 // return a hash range from 0 to 79999
  4 int hash(const char* str, int index)
  5 {
  6     int hash = 1;
  7     int seed = 12345;
  8     int curr;
  9     switch(index)
 10     {
 11     case 0:{
 12         while(curr = int(*str++))
 13         {
 14             hash = 128 * hash + curr;
 15         }
 16         return abs(hash%80000);
 17     }
 18     case 1:{
 19         while(curr = int(*str++))
 20         {
 21             hash = (25536 * hash + curr)%80000;
 22         }
 23         return abs(hash);
 24     }
 25     case 2:{
 26         while(curr = int(*str++))
 27         {
 28             hash = (seed * hash + curr)%80000;
 29             seed *= 123;
 30         }
 31         return abs(hash);
 32     }
 33     case 3:{
 34         while(curr = int(*str++))
 35         {
 36             hash += curr*curr;
 37         }
 38         return abs(hash%80000);
 39     }
 40     case 4:{
 41         while(curr = int(*str++))
 42         {
 43             hash += abs(curr*curr*curr);
 44         }
 45         return abs(hash%80000);
 46     }
 47     case 5:{
 48         while(curr = int(*str++))
 49         {
 50             hash *= (hash + curr*seed)%80000;
 51         }
 52         return abs(hash%80000);
 53     }
 54     case 6:{
 55         while(curr = int(*str++))
 56         {
 57             seed = 345;
 58             hash = (seed * hash + curr)%80000;
 59             seed *= 345;
 60         }
 61         return abs(hash);
 62     }
 63     }
 64     return -1;
 65 }
 66 
 67 void initBitMap(unsigned char* bitMap)
 68 {
 69     for(int i = 0; i<10000;i++)
 70     {
 71         bitMap[i] = 0;
 72     }
 73 }
 74 
 75 bool isKeyExistInBitMap(unsigned char* bitMap, const char* str)
 76 {
 77     for(int i = 0; i<7; i++)
 78     {
 79         int code = hash(str, i);
 80         if(!((bitMap[code/8] >> code%8) % 2))
 81         {
 82             return false;
 83         }
 84     }
 85     return true;
 86 }
 87 
 88 void appendKey2BitMap(unsigned char* bitMap, const char* str)
 89 {
 90     if(isKeyExistInBitMap(bitMap, str))
 91     {
 92         return;
 93     }
 94     for(int i = 0; i<7; i++)
 95     {
 96         int code = hash(str, i);
 97         if(!((bitMap[code/8] >> code%8) % 2))
 98         {
 99             bitMap[code/8] += 1 << code%8;
100         }
101     }
102 }

       文件bloomfilter.h:

 1 #ifndef BLOOMFILTER_H
 2 #define BLOOMFILTER_H
 3 
 4 #include <stdio.h>
 5 #include <math.h>
 6 
 7 int hash(const char* str, int index);
 8 void initBitMap(unsigned char* bitMap);
 9 bool isKeyExistInBitMap(unsigned char* bitMap, const char* str);
10 void appendKey2BitMap(unsigned char* bitMap, const char* str);
11 
12 #endif // BLOOMFILTER_H

       文件main.cpp:

 1 #include "mainwindow.h"
 2 #include <QApplication>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     MainWindow w;
 8     /*w.show();*/
 9     QIcon icon("E:/code/Qt/build-TangTang-DFZ-Release/release/th.jpg");
10     w.setWindowIcon(icon);
11     w.setWindowTitle("Simple Code Editor");
12     w.show();
13 
14     return a.exec();
15 }

       文件mainwindow.cpp:

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 
 4 #include <QSyntaxHighlighter>
 5 #include <QPushButton>
 6 #include <QObject>
 7 #include <QTextEdit>
 8 #include "myhighlight.h"
 9 
10 MainWindow::MainWindow(QWidget *parent) :
11     QMainWindow(parent),
12     ui(new Ui::MainWindow)
13 {
14     ui->setupUi(this);
15     QFont font;
16     font.setFamily("Consolas");
17     font.setFixedPitch(true);
18     font.setPointSize(20);
19 
20     editor = new QTextEdit;
21     editor->setFont(font);
22 
23     highlighter = new myHighLight(editor->document());
24 
25     setCentralWidget(editor);
26     setWindowTitle("Simple C++ Code Editor");
27 
28     connect(ui->actionappend_key, &QAction::triggered, this, &MainWindow::appendKey);
29     connect(ui->actionDelete_key, &QAction::triggered, this, &MainWindow::deleteKey);
30 }
31 
32 MainWindow::~MainWindow()
33 {
34     delete editor;
35     delete ui;
36 }
37 
38 void MainWindow::appendKey()
39 {
40     QString selectedText = editor->textCursor().selectedText();
41     highlighter->appendKey(selectedText);
42     highlighter->setDocument(editor->document());
43 }
44 
45 void MainWindow::deleteKey()
46 {
47     QString selectedText = editor->textCursor().selectedText();
48     highlighter->deleteKey(selectedText);
49     highlighter->setDocument(editor->document());
50 }

       文件mainwindow.h:

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 #include "myhighlight.h"
 6 #include <QTextEdit>
 7 #include <QtCore>
 8 
 9 namespace Ui {
10 class MainWindow;
11 }
12 
13 class MainWindow : public QMainWindow
14 {
15     Q_OBJECT
16 
17 public:
18     explicit MainWindow(QWidget *parent = 0);
19     ~MainWindow();
20 
21 private slots:
22     // append selected text for ui
23     void appendKey();
24     void deleteKey();
25 
26 private:
27     Ui::MainWindow *ui;
28 
29     QTextEdit *editor;
30     myHighLight *highlighter;
31 };
32 
33 #endif // MAINWINDOW_H

       文件mainwindow.ui自己拖一拖就行!

       文件myhighlight.cpp:

  1 #include "myhighlight.h"
  2 #include "bloomfilter.cpp"
  3 #include <QtGui>
  4 
  5 myHighLight::myHighLight(QTextDocument *parent)
  6     : QSyntaxHighlighter(parent)
  7 {
  8     // find each word
  9     rule = new QRegExp("(\b)(\w+)(\b)");
 10 
 11     format.setForeground(Qt::blue);
 12     format.setFontWeight(QFont::Bold);
 13 
 14     initBitMap(bitMap);
 15     QStringList keyWords = cppKeyword();
 16     for(QString key : keyWords)
 17     {
 18         appendKey(key);
 19     }
 20 }
 21 
 22 myHighLight::~myHighLight()
 23 {
 24     if(rule)
 25         delete rule;
 26 }
 27 
 28 QStringList myHighLight::cppKeyword()
 29 {
 30     return QStringList()<<"asm"<<"auto"<<"bool"<<"break"<<"case"<<"catch"<<"char"
 31                        <<"class"<<"const"<<"const_cast"<<"continue"<<"default"<<"delete"
 32                       <<"do"<<"double"<<"dynamic_cast"<<"else"<<"enum"<<"explicit"
 33                      <<"export"<<"extern"<<"false"<<"float"<<"for"<<"friend"<<"goto"
 34                     <<"if"<<"inline"<<"int"<<"long"<<"mutable"<<"namespace"<<"new"
 35                    <<"operator"<<"private"<<"protected"<<"public"<<"register"
 36                   <<"reinterpret_cast"<<"return"<<"short"<<"signed"<<"sizeof"<<"static"
 37                  <<"static_cast"<<"struct"<<"switch"<<"template"<<"this"<<"throw"
 38                 <<"true"<<"try"<<"typedef"<<"typeid"<<"typename"<<"union"<<"unsigned"
 39                <<"using"<<"virtual"<<"void"<<"volatile"<<"wchar_t"<<"while";
 40 }
 41 
 42 //QVector<int> myHighLight::Hash(QString word)
 43 //{
 44 //    std::hash<std::string> str_hash;
 45 //    QVector<int> res;
 46 //    if(word.size()%hashCount == 0)
 47 //    {
 48 //        word += " ";
 49 //    }
 50 //    QString key;
 51 //    while(key.size() < 100)
 52 //    {
 53 //        key += word;
 54 //    }
 55 
 56 //    for(int i = 0; i<hashCount; i++)
 57 //    {
 58 //        QString key0;
 59 //        for(int j = i;j<key.size(); j+=hashCount)
 60 //        {
 61 //            key0.append(key[j]);
 62 //        }
 63 //        res.append(abs(int(str_hash(key0.toStdString()))%(BloomFilter.size()*8-1)));
 64 //    }
 65 
 66 //    return res;
 67 //}
 68 
 69 void myHighLight::appendKey(QString key)
 70 {
 71     if(!rule->exactMatch(key))
 72     {
 73         qDebug()<<"KeyWord "<<key<<" is not a word";
 74         return;
 75     }
 76 
 77     if(whiteNameList.contains(key))
 78     {
 79         whiteNameList.removeOne(key);
 80     }
 81 
 82     appendKey2BitMap(bitMap, key.toStdString().data());
 83 //    if(isKeyExisted(key))
 84 //    {
 85 //        qDebug()<<"KeyWord "<<key<<" alredy existed!";
 86 //        return;
 87 //    }
 88 
 89 //    QVector<int> hash = Hash(key);
 90 //    for(auto code : hash)
 91 //    {
 92 //        if(!((BloomFilter[code/8] >> code%8) % 2))
 93 //        {
 94 //            BloomFilter[code/8] += 1 << code%8;
 95 //        }
 96 //    }
 97 }
 98 
 99 void myHighLight::deleteKey(QString key)
100 {
101     if(!rule->exactMatch(key))
102     {
103         qDebug()<<"KeyWord "<<key<<" is not a word";
104         return;
105     }
106 
107     if(whiteNameList.contains(key))
108     {
109         qDebug()<<"KeyWord "<<key<<" to be deleted has already been in whitelist";
110         return;
111     }
112 
113     if(!isKeyExisted(key))
114     {
115         qDebug()<<"KeyWord "<<key<<" to be deleted is not in the BloomFilter!";
116         return;
117     }
118 
119     whiteNameList.push_back(key);
120     qDebug()<<whiteNameList;
121 }
122 
123 bool myHighLight::isKeyExisted(QString key)
124 {
125     if(whiteNameList.contains(key))
126     {
127         return false;
128     }
129 
130     return isKeyExistInBitMap(bitMap, key.toStdString().data());
131 //    QVector<int> hash = Hash(key);
132 //    for(auto code : hash)
133 //    {
134 //        if(!((BloomFilter[code/8] >> code%8) % 2))
135 //        {
136 //            return false;
137 //        }
138 //    }
139 //    return true;
140 }
141 
142 void myHighLight::highlightBlock(const QString &text)
143 {
144     int index = rule->indexIn(text);
145     while(index >= 0)
146     {
147         int length = rule->matchedLength();
148         if(isKeyExisted(text.mid(index, length)))
149         {
150             setFormat(index, length, format);
151         }
152         index = rule->indexIn(text, index + length);
153     }
154 }

       文件myhighlight.h:

 1 #ifndef MYHIGHLIGHT_H
 2 #define MYHIGHLIGHT_H
 3 
 4 #include <QSyntaxHighlighter>
 5 #include <QTextCharFormat>
 6 
 7 class QTextDocument;
 8 
 9 class myHighLight : public QSyntaxHighlighter
10 {
11     Q_OBJECT
12 public:
13     myHighLight(QTextDocument *parent = 0);
14     ~myHighLight();
15 
16     static QStringList cppKeyword();
17 
18     // get a Hash Value Array from a word
19     QVector<int> Hash(QString word);
20     // append a keyword to the bloom filter
21     void appendKey(QString key);
22     // delete a keyword from the bloom filter
23     void deleteKey(QString key);
24     // judge if the word is existing in the bloom filter
25     bool isKeyExisted(QString key);
26 
27 protected:
28     // highlight the keyword block on updating document
29     void highlightBlock(const QString &text);
30 
31 private:
32     // regression expression for searching every words
33     QRegExp* rule;
34     // the format we plan to apply in keyword
35     QTextCharFormat format;
36 
37     // the structure to store keywords. it is expected to store 8000 words in total.
38     // More details in program report.
39     unsigned char bitMap[10000];
40 //    QVector<unsigned char> BloomFilter;
41     // each keyword in the whitelist is considered not to be in the BloomFilter
42     QVector<QString> whiteNameList;
43 
44 //    // the hash function count. 7 is best for 1% error possibility
45 //    const int hashCount = 7;
46 };
47 
48 #endif // MYHIGHLIGHT_H

 

以上是关于刁肥宅数据结构课设“布隆过滤器的实践与应用”源代码(v1.0,永不上交)的主要内容,如果未能解决你的问题,请参考以下文章

刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

肥宅快乐数

我用 80 行核心 JS 代码每个月躺着挣一瓶肥宅快乐水

我用 80 行核心 JS 代码每个月躺着挣一瓶肥宅快乐水

肥宅快乐树 换根+树形DP/dfs

数据结构课设:银行排队系统模拟