Exemplo n.º 1
0
        public int SearchWithDiff(string src, string sub, int diff)
        {
            int srcLen = src.Length;
            int subLen = sub.Length;

            if (srcLen < subLen)
                return -1;
            RkSearchHash hash = new RkSearchHash();
            long target = hash.GenerateHash(sub);
            long rolHash = hash.GenerateHash(src.Substring(0, subLen));
            int i = 0;
            int limit = srcLen - subLen;
            int rolDiff = 0;
            for (i = 0; i < limit; i++)
            {
                rolDiff = CountSetPairs((ulong)(target ^ rolHash));
                if (rolDiff <= diff)
                {
                    return i;
                }
                rolHash = hash.GenerateRollingHash(src[i], src[i + subLen], rolHash, subLen);
            }

            rolDiff = CountSetPairs((ulong)(target ^ rolHash));
            if (rolDiff <= diff)
            {
                return i;
            }
            return -1;
        }
Exemplo n.º 2
0
        public int Search(string src, string substr)
        {
            int srcLen = src.Length;
            int subLen = substr.Length;
            if (srcLen < subLen)
                return -1;

            RkSearchHash hash = new RkSearchHash();
            long target = hash.GenerateHash(substr);
            long rolHash = hash.GenerateHash(src.Substring(0, subLen));
            int i = 0;
            int limit = srcLen - subLen;
            for (i = 0; i < limit; i++)
            {
                if (rolHash == target)
                {
                    return i;
                }
                rolHash = hash.GenerateRollingHash(src[i], src[i + subLen], rolHash, subLen);
            }

            // Avoid per loop comparison, of i + susbstr.Length
            if (rolHash == target)
            {
                return i;
            }

            return -1;
        }
Exemplo n.º 3
0
        public void TestHash()
        {
            RkSearchHash hash = new RkSearchHash();
            long h = hash.GenerateHash("ACGT");
            Console.WriteLine("h: {0}", h);

            //Generate rolling hash for CGTA
            h = hash.GenerateRollingHash('A', 'A', h, 4);
            Console.WriteLine("h: {0}", h);
            Assert.AreEqual(h, hash.GenerateHash("CGTA"));

            //Generate rolling hash for GTAG from CGTA
            h = hash.GenerateRollingHash('C', 'G', h, 4);
            Console.WriteLine("h: {0}", h);
            Assert.AreEqual(h, hash.GenerateHash("GTAG"));
        }