Một số khoa học máy tính khắc phục, cho các kiểm toán viên PCI trong khán giả của tôi.
Tôi đưa cho bạn một mảng các số nguyên ngẫu nhiên. Làm thế nào bạn có thể biết nếu số ba là trong đó?
Chà, có một cách rõ ràng: kiểm tra các con số một cách tuần tự cho đến khi bạn tìm thấy 3 số 3 hoặc hết mảng. Tìm kiếm tuyến tính. Cho 10 số, bạn phải cho rằng nó có thể mất 10 bước; N số, N bước.
Hình 1.png
Tìm kiếm tuyến tính là xấu. Thật khó để làm tồi tệ hơn tuyến tính. Hãy cải thiện nó. Sắp xếp mảng.
Hình 2.png
Một mảng được sắp xếp gợi ý một chiến lược khác: nhảy vào giữa mảng và xem giá trị bạn đang tìm kiếm nhỏ hơn (bên trái) hay lớn hơn (bên phải). Lặp lại, cắt một nửa mỗi lần cho đến khi bạn tìm thấy giá trị.
Tìm kiếm nhị phân. Cho 10 số, sẽ mất tối đa 3 bước Tập hợp-log2 của 10 số- để tìm một trong số chúng trong một mảng được sắp xếp. Tìm kiếm O (log n) là tuyệt vời. Nếu bạn có 65.000 phần tử, sẽ chỉ mất 16 bước để tìm một trong số chúng. Nhân đôi các yếu tố và đó là 17 bước.
Nhưng sắp xếp mảng hút; đối với một điều, sắp xếp đắt hơn tìm kiếm tuyến tính. Vì vậy, chúng tôi không sử dụng tìm kiếm nhị phân nhiều; thay vào đó, chúng tôi sử dụng cây nhị phân.
Hình 3.png
Để tìm kiếm cây nhị phân, bạn bắt đầu ở trên cùng và tự hỏi mình là khóa của tôi ít hơn (trái) hoặc lớn hơn (phải) nút hiện tại, và lặp lại cho đến khi ok, ok, ok, bạn đã biết công cụ này rồi. Nhưng cái cây đó đẹp quá phải không?
Tìm kiếm với cây nhị phân (cân bằng) là O (log n), giống như tìm kiếm nhị phân, thay đổi theo số lượng phần tử trong cây. Cây nhị phân là tuyệt vời: bạn có được tra cứu nhanh và sắp xếp ngang qua, thứ gì đó bạn không nhận được từ bảng băm. Cây nhị phân là một thực hiện bảng mặc định tốt hơn so với bảng băm. 2.
Nhưng cây nhị phân không phải là cơ chế tra cứu cấu trúc cây duy nhất. Cơ sở nhị phân cố gắng, còn được gọi là cây BẠC, hoạt động giống như cây nhị phân với một điểm khác biệt cơ bản. Thay vì so sánh lớn hơn / ít hơn ở mỗi nút, bạn kiểm tra xem liệu một bit có được đặt hay không, phân nhánh phải nếu nó được đặt và trái nếu không.
Hình 4.png
Tôi đang bỏ qua rất nhiều về cách cơ số nhị phân cố gắng làm việc. Đây là một sự xấu hổ, bởi vì các cơ sở cố gắng nổi tiếng là không được phân tích rõ ràng trong các trò chơi - Sedgewick đã vô tình làm hỏng chúng trong Thuật toán Thuật thuật, và trang Wikipedia cho chúng thật tệ. Mọi người vẫn tranh cãi về những gì để gọi họ! Thay cho lời giải thích về các liên kết ngược và các cạnh được gắn nhãn vị trí bit, đây là một triển khai Ruby nhỏ.
Đây là lý do tại sao cơ số cố gắng là mát mẻ:
Search performance varies with the key size, not the number of elements in the tree. With 16 bit keys, you’re guaranteed 16 steps
bất kể số lượng các yếu tố trong cây, mà không cân bằng.
More importantly, radix tries give you lexicographic matching, which is a puffed-up way of saying “search with trailing wildcard”, or
Tìm kiếm theo dòng lệnh-hoàn thành-phong cách Trong một cây radix, bạn có thể nhanh chóng tìm kiếm các trò chơi ro ro và nhận được một cách nhanh chóng và một cách lãng mạn.
3.
Tôi đã mất bạn.
Hãy đặt điều này trong bối cảnh. Tries là một cấu trúc dữ liệu quan trọng cho định tuyến Internet. Vấn đề định tuyến diễn ra như sau:
You have a routing table with entries for “10.0.1.20/32 -> a” and “10.0.0.0/16 -> b”.
You need packets for 10.0.1.20 to go to “a”
You need packets for 10.0.1.21 to to to “b”
Đây là một vấn đề khó giải quyết với cây nhị phân cơ bản, nhưng với bộ ba cơ số, bạn chỉ cần yêu cầu 1010.0000.0000.0000.0000.0001.0100 (cho 10.0.1.20) và mật 1010. ). Tìm kiếm từ vựng cung cấp cho bạn các trận đấu hay nhất để định tuyến. Bạn có thể thử nó trong mã Ruby ở trên; thêm * xông 10.0.0.0 .xe.
Sự tương ứng giữa định tuyến và cơ số cố gắng mạnh đến mức thư viện trix radix trie đa năng phổ biến nhất (cái từ CPAN) thực sự bị đánh cắp khỏi GateD. Nhân tiện, đó là một mớ hỗn độn và không sử dụng nó.
Nếu bạn hiểu cách thức hoạt động của một bộ ba, bạn cũng hiểu cách các biểu thức chính quy hoạt động. Các thử nghiệm là một trường hợp đặc biệt của automata hữu hạn xác định (DFA), trong đó các nhánh chỉ dựa trên so sánh bit và luôn luôn phân nhánh về phía trước. Một công cụ regex tốt chỉ là xử lý các DFA với nhiều tính năng hơn nữa. Nếu những bức ảnh của tôi có ý nghĩa với bạn, thì những bức ảnh trong bài viết xuất sắc này về thuật toán giảm NFA-DFA của Thompson cũng sẽ như vậy, và bài viết đó sẽ giúp bạn thông minh hơn. 4.
Bạn là nhà điều hành mạng tại ISP xương sống. Thế giới của bạn chủ yếu bao gồm các tiền tố của những người khác, các mạng / mạng netmask. Các mặt nạ trong các tiền tố đó cực kỳ quan trọng đối với bạn. Chẳng hạn, 121/8 thuộc về Hàn Quốc; 121.128 / 10 thuộc về Korea Telecom, 121.128.10 / 24 thuộc về một khách hàng KT và 121.128.10.53 là một máy tính bên trong khách hàng đó. Nếu bạn đang theo dõi một mạng botnet hoặc một hoạt động spam hoặc lan truyền sâu, số netmask đó khá quan trọng đối với bạn.
Thật không may, mặc dù chúng rất quan trọng, nhưng không có nơi nào trên gói IP được đóng dấu, một mạng netmask đã bị đánh cắp hoàn toàn là một chi tiết cấu hình. Vì vậy, khi bạn đang xem lưu lượng truy cập, về cơ bản bạn có dữ liệu này để làm việc với:
ips.png
Đáng ngạc nhiên, được cung cấp đủ các gói để xem xét, đây là thông tin đủ để đoán netmasks với. Khi làm việc tại Sony, Kenjiro Cho đã nghĩ ra một cách thực sự tao nhã để làm điều đó, dựa trên những cố gắng. Đây là cách thực hiện:
Lấy một bộ ba cơ số nhị phân cơ bản, giống như các bộ định tuyến được sử dụng bởi các bộ định tuyến phần mềm. Nhưng ràng buộc số lượng nút trong cây, nói đến 10.000. Trên một liên kết xương sống, ghi lại địa chỉ từ các tiêu đề IP, bạn sẽ sử dụng 10.000 nút trong giây lát.
Lưu trữ danh sách các nút trong một danh sách, được sắp xếp theo thứ tự LRU. Nói cách khác, khi bạn kết hợp một địa chỉ IP với một nút, hãy chạm vào nút đó, gắn nó ở đầu danh sách. Dần dần, các địa chỉ thường thấy xuất hiện bong bóng lên đến đỉnh và các nút nhìn thấy không thường xuyên chìm xuống đáy.
Hình 6.png
Bây giờ là mẹo. Khi bạn hết các nút và cần một nút mới, hãy lấy lại từ cuối danh sách. Nhưng khi bạn thực hiện, cuộn dữ liệu từ nút lên trên cha của nó, như vậy:
Hình 5.png
10.0.1.2 và 10.0.1.3 là anh chị em / 32s, hai nửa của 10.0.1.2/31. Để lấy lại chúng, hãy hợp nhất chúng vào 10.0.1.2/31. Nếu bạn cần lấy lại 10.0.1.2/31, bạn có thể hợp nhất nó với 10.0.1.0/31 để tạo thành 10.0.1.0/30.
Làm điều này hơn, giả sử, một phút và các nguồn nổi bật sẽ bảo vệ vị trí của chúng trong cây bằng cách đứng đầu danh sách LRU, trong khi xung quanh / 32 bong bóng tiếng ồn lên đến / 0. Đối với danh sách thô của IP ở trên, với cây 100 nút, bạn sẽ có được cái này.
Cho gọi đây là Aguri heuristic. 5.
Aguri được cấp phép BSD. Bạn có thể tải xuống và chương trình trình điều khiển theo dõi các gói thông qua pcap, từ trang chủ cũ của Cho. 6.
Bây giờ tôi đang đi đâu đó với điều này, nhưng bây giờ tôi có 1300 từ trong bài viết này và nếu bây giờ bạn là một người làm thuật toán, bạn cảm thấy mệt mỏi với tôi và nếu bạn không, bạn sẽ mệt mỏi với tôi hiện nay. Vì vậy, hãy để Aguri chìm vào, và tôi sẽ cho bạn thứ gì đó hay ho và vô dụng để làm với nó vào cuối tuần này.
Có rất nhiều liên kết rải rác trong đó. Thật không may, Archive.org không giữ hình ảnh, chỉ có văn bản, vì vậy một vài trong số chúng đã bị mất. Đây là những cái mà nó đã lưu trữ: