2

내 질문은 두 문자열을 비교하는 가장 빠른 (품질도 중요하지만 조금 덜 중요) 방법은 무엇입니까?더 나은 문자열 비교 방법

두 문자열을 비교하는 가장 효율적인 방법을 찾고 있습니다. 비교할 문자열 중 일부는 5000자를 초과 할 수 있습니다. 저는 약 80 개의 문자열 목록을 약 200 개의 문자열 목록과 비교하고 있습니다. 내가 쓰레딩 할 때조차도 영원히 필요합니다. 나는 Apache Commons의 StringUtils.getLevenshteinDistance(String s, String t) 메소드를 사용하고있다. 내 방법은 다음과 같습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

문자열 1 :

SELECT 
CORP_VENDOR_NAME as "Corporate Vendor Name", 
CORP_VENDOR_REF_ID as "Reference ID", 
MERCHANT_ID as "Merchant ID", 
VENDOR_CITY as "City", 
VENDOR_STATE as "State", 
VENDOR_ZIP as "Zip", 
VENDOR_COUNTRY as "Country", 
REMIT_VENDOR_NAME as "Remit Name", 
REMIT_VENDOR_REF_ID as " Remit Reference ID", 
VENDOR_PRI_UNSPSC_CODE as "Primary UNSPSC" 
FROM DSS_FIN_USER.ACQ_VENDOR_DIM 
WHERE VENDOR_REFERENCE_ID in 
(SELECT distinct CORP_VENDOR_REF_ID 
FROM DSS_FIN_USER.ACQ_VENDOR_DIM 
WHERE CORP_VENDOR_REF_ID = '${request.corp_vendor_id};') 

문자열 2 :

SELECT 
CORP_VENDOR_NAME as "Corporate Vendor Name", 
CORP_VENDOR_REF_ID as "Reference ID", 
MERCHANT_ID as "Merchant ID", 
VENDOR_CITY as "City", 
VENDOR_STATE as "State", 
VENDOR_ZIP as "Zip", 
VENDOR_COUNTRY as "Country", 
REMIT_VENDOR_NAME as "Remit Name", 
REMIT_VENDOR_REF_ID as " Remit Reference ID", 
VENDOR_PRI_UNSPSC_CODE as "Primary UNSPSC" 
FROM DSS_FIN_USER.ACQ_VENDOR_DIM 
WHERE VENDOR_REFERENCE_ID in 
(SELECT distinct CORP_VENDOR_REF_ID 
FROM DSS_FIN_USER.ACQ_VENDOR_DIM 
WHERE CORP_VENDOR_REF_ID = 'ACQ-169013') 

당신은 만 알 수 있습니다 여기에

private void compareMe() { 
    List<String> compareStrings = MainController.getInstance().getCompareStrings(); 
    for (String compare : compareStrings) { 
    int levenshteinDistance = StringUtils.getLevenshteinDistance(me, compare); 
    if (bestScore > levenshteinDistance 
      && levenshteinDistance > -1) { 
     bestScore = levenshteinDistance; //global variable 
     bestString = compare; //global variable 
    } 
    } 
} 

는 좋은 점수를 가지고 있어야 두 문자열의 샘플입니다 차이는 문자열 끝에 '${request.corp_vendor_id};'입니다. 이로 인해 LevenshteinDistance 메서드에서 26의 점수를 갖게됩니다.

+2

"비교"가 의미하는 것을 정의하십시오. "Compare"는 일반적으로 == /! = 또는>/==/<을 의미하지만 거리 함수를 사용하고 있으므로 분명히 이진 비교를 원하지 않습니다. –

+1

문자열의 내용에 대해 알지 못하면 실제로 최적화 할 수 없습니다 (AB와 BA를 비교하지 않기 위해 다른 것) –

+0

당신이 할 수있는 일은 비교 방법의 소스를 얻고 " "어떻게 든. 모든 "거리"비교는 비쌀 것입니다. 하지만 모든 경우 실제 스코어 대신에 "go/no-go"결과 만 필요하면 데이터의 특성에 따라 사전 컨디셔닝 테스트를 사용할 수 있습니다. –

답변

2

일부 계산을 피하기 위해 비교 논리에서 가능한 바로 가기에 대해 생각해야합니다. 따라서 Levensthein 거리를 전체적으로 최소화하려면 문자열 크기의 차이가 현재 Levenshtein 거리보다 큰 경우에도 Levensthein 거리를 계산할 필요가 없습니다.

예. 현재 가장 좋은 Levenshtein 거리가 50이라면 Levenshtein 거리가 최소 80이기 때문에 100과 180 크기의 두 문자열을 비교하지 않아도됩니다.

+0

굉장 팁. 감사! – kentcdodds

+0

그냥 알다시피. 이것은 내 방법의 속도를 약 4 배로 증가 시켰습니다. 엄청 고마워! – kentcdodds