• Nếu phạm vi phần tử phân biệt đã biết thì đơn giản chỉ cần tăng các bộ đếm C[1] [h1(k)], C[2][h2(k)],…, C[h] [hh(k)] thêm 1 khi thêm vào phần tử k. FIIN (k) • N=N+1; • For j=1 to h • mi=hj[k] • If OF[j][mi]==1 • (*(C[j][mi]))++;
• Else If OF[j][mi]==0 and C[j] [mi]==2x-1
• Tạo bộ đếm (LCnew) với kích thước 2x bits
• LCnew=2x;
• Đặt C[j][mi] trỏ tới LCnew; • OF[j][mi]=1;
• Else
• C[j][m]++;
Hàm chèn phần tử vào bộ lọc
• Chọn bộ lọc EBF thích hợp để chèn.
• Khi bộ đếm BC C[i][hi(k)] với 1≤ i ≤ h bị tràn thì tạo ra bộ đếm LCnew với độ dài là 2x (x
là độ dài của BC)̀ và giá trị của BC là con trỏ tới LCnew.
• Đồng thời OF[i][hi(k)] được gán là 1 để̉ chỉ ra rằng bộ đếm BC C[i][hi(k)] đã bị tràn và đã thêm LCnew.
Hàm thêm phần tử vào bộ lọc
• INSERT(k)
• If không biết phạm vi dữ liệu của luồng dữ liệu • If k là item đầu tiên trong luồng dữ liệu
• Tạo EBF mới có phạm vi M0;
• Khởi tạo EBF vừa được khởi tạo EBF;
• End if
• MIDA(k,ktype);
• Else
• If k là item đầu tiên trong luồng dữ liệu
• Tạo EBF mới có khả năng lưu trữ M item; • // M is phạm vi dữ liệu của luồng dữ liệu
• Khởi tạo EBF vừa mới tạo ra; • End if
• If thời điểm phân rã • Decay();
• Trong điều kiện ta không biết phạm vi dữ liệu của luồng dữ liệu, đầu tiên chúng ta xây dựng EBF có kích thước là M0 với phạm vi từ 1 tới R1. Nếu các item trong luồng dữ liệu mà ở ngoài phạm vi của EBF mới tạo gần nhất thì một EBF mới sẽ được tạo ra với kích thước lớn hơn trước, phạm vi của EBF mới gấp 10 lần cái trước.
• Ví dụ, nếu EBF đầu tiên (EBF1) được tạo ra để chứa các phần tử được sắp xếp từ 1 tới R1, khi một phần tử vượt ra ngoài [1, R1] thì ta tạo ra một EBF mới để xử lý các phần tử trong phạm vi [R1 + 1, R2] trong đó R2 = 10 * R1.Thủ tục MIDA(k) xử lý tình huống như vậy, quá
trình phân rã vẫn được kiểm soát trong trường hợp này.
MIDA(k)
• If thời điểm phân rã
• Decay();
• End if
• If giá trị của k thuộc phạm vi của một EBF nào đó • Chọn EBF thích hợp cho k theo giá trị của nó; • FIIN(k);
• Else
• While giá trị k không thuộc phạm vị của EBF nào • Do
• Tạo ra một EBF mới có phạm vi M010i;
• End while
• //M0 là phạm vi của EBF đầu tiên, • //i là số EBF hiện tại
Kết luận