using System;
using System.Collections.Generic;
using System.Diagnostics;
public class Test
{
public static void Main()
{
List<int> results;
List<int> m;
List<int> n;
int x;
Stopwatch sw;
// warmup
results = new List<int>(200);
for(x = 0; x < 100; x++) {
results.Add(SortedExcept(Make(10, 13), Make(100, 7)).Count);
results.Add(SortedExcept(Make(10, 13), Make(100, 7)).Count);
}
// test M * Ln(N)
sw = new Stopwatch();
results = new List<int>(200);
m = Make(50, 3);
n = Make(10000000, 2);
sw.Start();
for(x = 0; x < 100; x++) {
results.Add(SortedExcept(m, n).Count);
results.Add(SortedExcept(m, n).Count);
}
sw.Stop();
Console.WriteLine("M * LN( N ) : " + results[0]);
Console.WriteLine(sw.Elapsed.TotalSeconds.ToString());
// test N * Ln(M)
sw = new Stopwatch();
results = new List<int>(200);
m = Make(10000000, 2);
n = Make(50, 3);
sw.Start();
for(x = 0; x < 100; x++) {
results.Add(SortedExcept(n, m).Count);
results.Add(SortedExcept(n, m).Count);
}
sw.Stop();
Console.WriteLine("N * LN( M ) : " + results[0]);
Console.WriteLine(sw.Elapsed.TotalSeconds.ToString());
// test M + N
sw = new Stopwatch();
results = new List<int>(200);
m = Make(50, 3);
n = Make(10000000, 2);
sw.Start();
for(x = 0; x < 100; x++) {
results.Add(SortedExcept2(m, n).Count);
results.Add(SortedExcept2(m, n).Count);
}
sw.Stop();
Console.WriteLine("M + N : " + results[0]);
Console.WriteLine(sw.Elapsed.TotalSeconds.ToString());
}
public static List<int> Make(int size, int stride) {
List<int> result = new List<int>();
for(int i = 0, x = 0; x < size; i+=stride, x++) {
result.Add(i);
}
return result;
}
public static List<T> SortedExcept<T>(List<T> m, List<T> n) {
var result = new List<T>();
int i, index;
for(i = 0; i < m.Count; i++) {
index = n.BinarySearch(m[i]);
if(index < 0) {
result.Add(m[i]);
}
}
return result;
}
public static List<T> SortedExcept2<T>(List<T> m, List<T> n) where T : IComparable<T> {
var result = new List<T>();
int i = 0, j = 0;
if(n.Count == 0) {
result.AddRange(m);
return result;
}
while(i < m.Count) {
if(m[i].CompareTo(n[j]) < 0) {
result.Add(m[i]);
i++;
} else if(m[i].CompareTo(n[j]) > 0) {
j++;
} else {
i++;
}
if(j >= n.Count) {
for(; i < m.Count; i++) {
result.Add(m[i]);
}
break;
}
}
return result;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwoKcHVibGljIGNsYXNzIFRlc3QKewogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewoJCUxpc3Q8aW50PiByZXN1bHRzOwoJCUxpc3Q8aW50PiBtOwoJCUxpc3Q8aW50PiBuOwogICAgICAgIGludCB4OwogICAgICAgIFN0b3B3YXRjaCBzdzsKICAgICAgICAKICAgICAgICAvLyB3YXJtdXAKICAgICAgICByZXN1bHRzID0gbmV3IExpc3Q8aW50PigyMDApOwogICAgICAgIGZvcih4ID0gMDsgeCA8IDEwMDsgeCsrKSB7CiAgICAgICAgCXJlc3VsdHMuQWRkKFNvcnRlZEV4Y2VwdChNYWtlKDEwLCAxMyksIE1ha2UoMTAwLCA3KSkuQ291bnQpOwogICAgICAgIAlyZXN1bHRzLkFkZChTb3J0ZWRFeGNlcHQoTWFrZSgxMCwgMTMpLCBNYWtlKDEwMCwgNykpLkNvdW50KTsKICAgICAgICB9CgogICAgICAgIC8vIHRlc3QgTSAqIExuKE4pCiAgICAgICAgc3cgPSBuZXcgU3RvcHdhdGNoKCk7CiAgICAgICAgcmVzdWx0cyA9IG5ldyBMaXN0PGludD4oMjAwKTsKICAgICAgICBtID0gTWFrZSg1MCwgMyk7CiAgICAgICAgbiA9IE1ha2UoMTAwMDAwMDAsIDIpOwogICAgICAgIHN3LlN0YXJ0KCk7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgMTAwOyB4KyspIHsKICAgICAgICAJcmVzdWx0cy5BZGQoU29ydGVkRXhjZXB0KG0sIG4pLkNvdW50KTsKICAgICAgICAJcmVzdWx0cy5BZGQoU29ydGVkRXhjZXB0KG0sIG4pLkNvdW50KTsKICAgICAgICB9CiAgICAgICAgc3cuU3RvcCgpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJNICogTE4oIE4gKSA6ICIgKyByZXN1bHRzWzBdKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShzdy5FbGFwc2VkLlRvdGFsU2Vjb25kcy5Ub1N0cmluZygpKTsKCQkKCQkvLyB0ZXN0IE4gKiBMbihNKQogICAgICAgIHN3ID0gbmV3IFN0b3B3YXRjaCgpOwogICAgICAgIHJlc3VsdHMgPSBuZXcgTGlzdDxpbnQ+KDIwMCk7CiAgICAgICAgbSA9IE1ha2UoMTAwMDAwMDAsIDIpOwogICAgICAgIG4gPSBNYWtlKDUwLCAzKTsKICAgICAgICBzdy5TdGFydCgpOwogICAgICAgIGZvcih4ID0gMDsgeCA8IDEwMDsgeCsrKSB7CiAgICAgICAgCXJlc3VsdHMuQWRkKFNvcnRlZEV4Y2VwdChuLCBtKS5Db3VudCk7CiAgICAgICAgCXJlc3VsdHMuQWRkKFNvcnRlZEV4Y2VwdChuLCBtKS5Db3VudCk7CiAgICAgICAgfQogICAgICAgIHN3LlN0b3AoKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTiAqIExOKCBNICkgOiAiICsgcmVzdWx0c1swXSk7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoc3cuRWxhcHNlZC5Ub3RhbFNlY29uZHMuVG9TdHJpbmcoKSk7CgkJCgkJLy8gdGVzdCBNICsgTgoJCXN3ID0gbmV3IFN0b3B3YXRjaCgpOwogICAgICAgIHJlc3VsdHMgPSBuZXcgTGlzdDxpbnQ+KDIwMCk7CiAgICAgICAgbSA9IE1ha2UoNTAsIDMpOwogICAgICAgIG4gPSBNYWtlKDEwMDAwMDAwLCAyKTsKICAgICAgICBzdy5TdGFydCgpOwogICAgICAgIGZvcih4ID0gMDsgeCA8IDEwMDsgeCsrKSB7CiAgICAgICAgCXJlc3VsdHMuQWRkKFNvcnRlZEV4Y2VwdDIobSwgbikuQ291bnQpOwogICAgICAgIAlyZXN1bHRzLkFkZChTb3J0ZWRFeGNlcHQyKG0sIG4pLkNvdW50KTsKICAgICAgICB9CiAgICAgICAgc3cuU3RvcCgpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJNICsgTiA6ICIgKyByZXN1bHRzWzBdKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShzdy5FbGFwc2VkLlRvdGFsU2Vjb25kcy5Ub1N0cmluZygpKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBMaXN0PGludD4gTWFrZShpbnQgc2l6ZSwgaW50IHN0cmlkZSkgewogICAgCUxpc3Q8aW50PiByZXN1bHQgPSBuZXcgTGlzdDxpbnQ+KCk7CiAgICAJZm9yKGludCBpID0gMCwgeCA9IDA7IHggPCBzaXplOyBpKz1zdHJpZGUsIHgrKykgeyAKICAgICAgICAgICAgcmVzdWx0LkFkZChpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIExpc3Q8VD4gU29ydGVkRXhjZXB0PFQ+KExpc3Q8VD4gbSwgTGlzdDxUPiBuKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0PFQ+KCk7CiAgICAgICAgaW50IGksIGluZGV4OwogICAgICAgIGZvcihpID0gMDsgaSA8IG0uQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmRleCA9IG4uQmluYXJ5U2VhcmNoKG1baV0pOwogICAgICAgICAgICBpZihpbmRleCA8IDApIHsgCiAgICAgICAgICAgICAgICByZXN1bHQuQWRkKG1baV0pOyAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIExpc3Q8VD4gU29ydGVkRXhjZXB0MjxUPihMaXN0PFQ+IG0sIExpc3Q8VD4gbikgd2hlcmUgVCA6IElDb21wYXJhYmxlPFQ+IHsKICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExpc3Q8VD4oKTsKICAgICAgICBpbnQgaSA9IDAsIGogPSAwOwogICAgICAgIGlmKG4uQ291bnQgPT0gMCkgewogICAgICAgIAlyZXN1bHQuQWRkUmFuZ2UobSk7CiAgICAgICAgCXJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHdoaWxlKGkgPCBtLkNvdW50KSB7CiAgICAgICAgCWlmKG1baV0uQ29tcGFyZVRvKG5bal0pIDwgMCkgewogICAgICAgIAkJcmVzdWx0LkFkZChtW2ldKTsKICAgICAgICAJCWkrKzsKICAgICAgICAJfSBlbHNlIGlmKG1baV0uQ29tcGFyZVRvKG5bal0pID4gMCkgewogICAgICAgIAkJaisrOwogICAgICAgIAl9IGVsc2UgewogICAgICAgIAkJaSsrOwogICAgICAgIAl9CiAgICAgICAgCWlmKGogPj0gbi5Db3VudCkgewogICAgICAgIAkJZm9yKDsgaSA8IG0uQ291bnQ7IGkrKykgeyAKICAgICAgICAJCQlyZXN1bHQuQWRkKG1baV0pOyAKICAgICAgICAJCX0KCQkJCWJyZWFrOwogICAgICAgIAl9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cn0=