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

在玩九宮棋時,靈感一現,想到」中心與圓「,便想到了用圓規畫圓的過程,圓規畫圓就像雷達掃描那樣麼!顯然,數據的匹配也能夠作到像雷達掃描那樣去發現並匹配目標(很差意思,改用繁體了^-^)。因此,乾脆就叫」雷達「算了!畢竟,要比常見的匹配算法快很多;測試還是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;
}
相關文章
相關標籤/搜索