VBScript : Levenshtein Distance

Levenshtein Distance은 두 문자열의 유사도를 구할 때 사용할 수 있는 알고리듬이다. 이 알고리듬은 첫번째 문자열을 두번째 문자열로 변환하기 위해서 필요한 작업수를 구한다.

예로 GeorgeGeordie 두 문자열을 생각해 보자. George를 Geordie로 바꾸기 위해서는 다음과 같이 2개의 문자 변환 작업이 필요하다.

  1. George -> Geordie (‘g’를 ‘d’로 치환)
  2. Georde -> Geordie (‘d’와 ‘e’ 사이에 ‘i’ 추가)

이미지 출처 : http://www.codeproject.com/Articles/162790/Fuzzy-String-Matching-with-Edit-Distance

다음은 VBScript로 이를 구현한 소스이다.


Function LevenshteinDistance(string1, string2)
Dim i, j, len1, len2, distance(), result

len1 = Len(string1) : len2 = Len(string2)
ReDim distance(len1, len2)
For i = 0 To len1 : distance(i, 0) = i : Next
For j = 0 To len2 : distance(0, j) = j : Next

For i = 1 To len1
For j = 1 To len2
If Asc(Mid(string1, i, 1)) = Asc(Mid(string2, j, 1)) Then
distance(i, j) = distance(i - 1, j - 1)
Else
distance(i, j) = Min3(distance(i - 1, j) + 1, distance(i, j - 1) + 1, distance(i - 1, j - 1) + 1)
End If
Next
Next

LevenshteinDistance = distance(len1, len2)
End Function

Function Min3(a, b, c)
Dim result

result = a
if (b < result) then result = b
if (c < result) then result = c

Min3 = result
End Function

VBScript: 크기가 정해지지 않은 DynamicArray 클래스

DynamicArray 클래스

Class DynamicArray
    '************** Properties **************
    Private aData
    '****************************************

    '*********** Event Handlers *************
    Private Sub Class_Initialize()
        Redim aData(0)
    End Sub
    '****************************************

    '************ Property Get **************
    Public Property Get Data(iPos)
        'Make sure the end developer is not requesting an
        '"out of bounds" array element
        If iPos < LBound(aData) or iPos > UBound(aData) then
            Exit Property    'Invalid range
        End If

        Data = aData(iPos)
    End Property

    Public Property Get DataArray()
        DataArray = aData
    End Property
    '****************************************

    '************ Property Let **************
    Public Property Let Data(iPos, varValue)
        'Make sure iPos >= LBound(aData)
        If iPos < LBound(aData) Then Exit Property

        If iPos > UBound(aData) then
            'We need to resize the array
            Redim Preserve aData(iPos)
            aData(iPos) = varValue
        Else
            'We don't need to resize the array
            aData(iPos) = varValue
        End If
    End Property
    '****************************************

    '************** Methods *****************
    Public Function StartIndex()
        StartIndex = LBound(aData)
    End Function

    Public Function StopIndex()
        StopIndex = UBound(aData)
    End Function

    Public Sub Delete(iPos)
        'Make sure iPos is within acceptable ranges
        If iPos < LBound(aData) or iPos > UBound(aData) then
            Exit Sub    'Invalid range
        End If

        Dim iLoop
        For iLoop = iPos to UBound(aData) - 1
            aData(iLoop) = aData(iLoop + 1)
        Next

        Redim Preserve aData(UBound(aData) - 1)
    End Sub
    '****************************************
End Class

출처: http://www.4guysfromrolla.com/webtech/032800-1.shtml

ASP에서 SQLite 사용하기

http://www.ch-werner.de/sqliteodbc/ 에서 SQLite ODBC Driver를 다운받아 설치한다.

다음 형태의 커넥션 문자열을 이용하여 SQLite를 사용한다.
DRIVER=SQLite3 ODBC Driver;Database=mydb.sqlite;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;
Database= 다음에 DB 파일의 경로를 입력해 주면 된다. 그 외의 옵션은 무슨 내용인지 알 길이 없다.
테스트를 해보니 SELECT는 엄청 빠른데 INSERT는 10개의 레코드를 추가하는데 1초 이상이 걸린다. 너무 느린데, 뭔가 잘못 되어 있나???
잘못되어 있는게 아니라 SQLite가 File 기반이다 보니 매번 INSERT가 일어날 때마다 File에 Write를 해서 느리다.