On Thursday, 15 June 2017 at 13:41:07 UTC, MGW wrote:
On Thursday, 15 June 2017 at 13:16:24 UTC, CRAIG DILLABAUGH wrote:

The purpose - search of changes in file system.
Sorting is a slow operation as well as hashing. Creation of a tree, is equally in sorting.
So far the best result:

foreach(str; m2) {
        bool fFind;     int j;
        foreach(int i, s; m1) {
                if(str == s) { fFind = true; j = i; break; }
        }
        if(!fFind) { rez ~= str; }
        else       {    m1[j] = m1[$-1]; m1.length = m1.length - 1;     }
}

Ugh. This can work as slow as length-of-m1 *multiplied* by length-of-m2. For 5,000,000 strings, it is 5,000,000 * 5,000,000 = 25,000,000,000,000. Granted, if you run it very often, the arrays are almost equal, and it's closer to linear. But once there are substantial changes between two consecutive runs, this approach is seriously screwed.

Sorting would work in length-of-array * log(length-of-array). For 5,000,000 strings, it is 5,000,000 * 23 = 115,000,000. This is ~217,391 times better than your method above. May be a bit slower because of long common prefixes. Anyway, a couple of seconds at most. How fast you need it to be? Did you actually try it?

Ivan Kazmenko.

Reply via email to