最近想到一種新的數據匹配算法

在玩九宮棋時,靈感一現,想到”中心與圓“,便想到了用圓規畫圓的過程,圓規畫圓就像雷達掃描那樣麽!顯然,數據的匹配也可以做到像雷達掃描那樣去發現並匹配目標(不好意思,改用繁體了^-^)。所以,乾脆就叫”雷達“算了!畢竟,要比常見的匹配算法快不少;測試還是Debug模式的靠譜點,現在發行版的優化真的從指令到邏輯都做到了極緻,都面目全非了。

static char * _cdecl al_radar_find(const char * lpText, size_t uTextLen, const char * lpContent, size_t uContentLen)
{
    size_t uOdd = uContentLen % 2U;
    const size_t uZone = (uContentLen / 2U - 1U) + uOdd;
    const size_t uMove = (uZone + 2U) - uOdd;

    for (size_t i = uZone; i < uTextLen; i += uContentLen) {
        register size_t j = 0U;
        do {
            if (((char *)(lpText + i))[j] == lpContent[0]) {
                register size_t c = 1U;
                uOdd = i + j;
                do {
                    if (((char *)(lpText + uOdd))[c] != lpContent[c]) {
                        goto JMP_BYTE_NEXT;
                    }
                } while ((++c) < uContentLen);
                return (char *)(lpText + uOdd);
            }
            if (((char *)(lpText + i))[j] == lpContent[uZone]) {
                register size_t c = 0U;
                uOdd = (i + j) - uZone;
                do {
                    if (((char *)(lpText + uOdd))[c] != lpContent[c]) {
                        goto JMP_BYTE_NEXT;
                    }
                } while ((++c) < uContentLen);
                return (char *)(lpText + uOdd);
            }
        JMP_BYTE_NEXT:
            ++j;
        } while (j < uMove);
    }
    return NULL;
}

 

posted on 2019-11-30 14:11  AL10000  阅读(...)  评论(... 编辑 收藏

导航