added simple trie

This commit is contained in:
Ilya Ig. Petrov 2015-11-28 05:32:25 +05:00
parent ceb6474456
commit 2000a3020d
7 changed files with 129 additions and 54 deletions

View File

@ -44,4 +44,4 @@ blocked-ips-switch.js: 30 bytes, 1339607 ns, Missed: 84 bytes,
blocked-ips-binary.js: 31 bytes, 3552007 ns, Missed: 76 bytes, 603872 ns
======================
blocked-hosts-binary-trie.js: 364 bytes, 27134555ns, Missed: 218 bytes, 725467 ns
blocked-hosts-simple-trie.js: 364 bytes, 4085395 ns, Missed: 219 bytes, 649011 ns

View File

@ -70,7 +70,7 @@ public class Program
var hostsFile = "./Inputs/"+prefix + ".txt";
var missedFile = "./Inputs/missed.txt";
var results = pacName+":\t"+RunTest(hostsFile, pacName) + ", Missed: "+RunTest(missedFile, pacName, true);
var results = pacName+": "+RunTest(hostsFile, pacName) + ", Missed: "+RunTest(missedFile, pacName, true);
Console.WriteLine(results);
resultsWriter.WriteLine(results);
}

View File

@ -61,11 +61,11 @@ var Antizapret = {
},
applyCsv: function(csv) {
var pac = generatePac(csv);
console.log(pac);
var config = {
mode: "pac_script",
mode: 'pac_script',
pacScript: {
data: pac
data: pac,
mandatory: true
}
};

View File

@ -319,7 +319,7 @@ function ifProxyByPlainSwitch(host) {
var doms = host.split('.');
for( var endi = doms.length; endi >= 0; --endi )
for( var endi = doms.length-1; endi >= 0; --endi )
if (ifBlocked( doms.slice( endi ).join('.') ))
return true;
return false;
@ -328,4 +328,87 @@ function ifProxyByPlainSwitch(host) {
var cases = hosts.map( host => 'case "'+host+'":' ).join('\n') +'\nreturn true;';
var tmp = ifProxyByPlainSwitch.toString().replace('//CASES', cases);
produceOutput('blocked-hosts-plain-switch', tmp, 'host' );
produceOutput( 'blocked-hosts-plain-switch', tmp, 'host' );
// SIMPLY TRIE
function populateSimpleTrie(trie, letters) {
if (!letters.length || !trie)
return trie;
var letter = letters.shift();
if (!letters.length) {
trie[letter] = ['', false];
return trie;
}
if (trie[letter] === ['', false]) // Subdomain of a blocked domain.
return trie;
if (!trie[letter]) {
trie[letter] = [letters.join(''), false]
return trie;
}
var arr = trie[letter];
var link = arr[0].split('');
var linkTrie = arr[1];
function commonPrefix(wa, wb) {
var len = Math.min(wa.length, wb.length);
var i = -1;
while(++i < len)
if (wa[i] !== wb[i])
break;
return wa.slice(0, i)
}
var prefix = commonPrefix(link, letters);
var suffixLetters = letters.slice(prefix.length);
var suffixLink = link.slice(prefix.length);
var newTrie = {};
if (!suffixLink.length)
var newTrie = linkTrie;
if (!suffixLetters.length)
var newTrie = false;
if (newTrie) {
newTrie = populateSimpleTrie( newTrie, suffixLetters );
newTrie = populateSimpleTrie( newTrie, suffixLink );
}
trie[letter] = [prefix.join(''), newTrie];
return trie;
}
var simpleTrie = {};
for(var host of hosts)
populateSimpleTrie(simpleTrie, host.split('').reverse());
function ifProxyBySimpleTrie(host, simpleTrie) {
var letters = host.split('').reverse();
while(letters.length) {
var letter = letters.shift();
var arr = simpleTrie[letter];
var link = arr[0];
if (link.length > letters.length)
return false;
for( var i=0; i < link.length; ++i )
if ( letters[i] !== link.charAt(i) )
return false;
letters = letters.slice(link.length);
simpleTrie = arr[1];
if (!simpleTrie)
return true;
}
}
produceOutput('blocked-hosts-simple-trie', ifProxyBySimpleTrie, 'host', simpleTrie);

File diff suppressed because one or more lines are too long

View File

@ -9849,7 +9849,7 @@ return true;
var doms = host.split('.');
for( var endi = doms.length; endi >= 0; --endi )
for( var endi = doms.length-1; endi >= 0; --endi )
if (ifBlocked( doms.slice( endi ).join('.') ))
return true;
return false;

File diff suppressed because one or more lines are too long