, 무엇을 할 수 있습니다 당신 MongoDB 또는 MySQL을 사용하여 최적으로 사용하고 싶습니다. 아래의 답에서 MongoDB를 설명 하겠지만이 대답을 MySQL로 이식하는 것은 쉽습니다.
먼저 문제를 조금 수정 해 보겠습니다. "접두어 범위"를 매칭하는 것에 대해 이야기 할 때, 나는 당신이 실제로 말하고있는 것은 사전 식 주문 (직관적으로 이것은 문자열의 자연 알파벳 순서 임)에서 올바른 범위를 찾는 것이라고 믿습니다. 예를 들어, 접두사가 54661601 ~ 54661679와 일치하는 숫자 세트는 문자열로 쓰여졌을 때 사전 식으로 "54661601"보다 크거나 같지만 사전 식으로 "54661680"보다 작은 숫자 세트입니다. 따라서 가장 먼저해야 할 일은 모두 의 범위를 1로 늘려서 범위를 지정하는 것입니다. 이렇게하면이 방법으로 쿼리를 표현할 수 있습니다.
{low: "54661601", high: "54661680", bin: "a"}
{low: "526219100", high: "526219200", bin: "b"}
{low: "4305870404", high: "4305870405", bin: "c"}
지금 문제가되고처럼 몽고에서 문서가 보일 것입니다 : 양식 [낮은, 높은)의 1 차원 간격의 세트가 지정되면, 우리는 신속하게 (이 간격을 찾을 수있는 방법 s)에 주어진 점이 있습니까? 이를 수행하는 가장 쉬운 방법은 낮은 또는 높은 필드의 색인을 사용하는 것입니다. 높음 필드를 사용합니다. mongo 쉘에서 :
db.coll.ensureIndex({high : 1})
이제는 간격이 전혀 겹치지 않는다고 가정 해 봅시다. 이 경우 주어진 쿼리 포인트 "x"에 대해 "x"를 포함 할 수있는 유일한 간격은 이 고 값이 "x"보다 큰 값입니다. 따라서 해당 문서를 쿼리하여 값이 0 일 때 값이 "x"보다 작은 지 여부를 확인할 수 있습니다.
이
db.coll.find({high : {'$gt' : "5466160179125211"}}).sort({high : 1}).limit(1).forEach(
function(doc){ if (doc.low <= "5466160179125211") printjson(doc) }
)
대신 전혀 중복되지 않는 간격을 가정 지금의 가정, 당신은 모든 간격 미만 K와 겹치는 것을 가정가있는 경우 예를 들어,이, 일치하는 간격을 인쇄합니다 이웃 한 간격 (나는 의 어떤 값이인지 알지 못한다. 이 경우, 당신은, 위의 "제한"에 K 1을 대체 할 수있는 즉
db.coll.find({high : {'$gt' : "5466160179125211"}}).sort({high : 1}).limit(k).forEach(
function(doc){ if (doc.low <= "5466160179125211") printjson(doc) }
)
무엇이 알고리즘의 실행 시간을입니까?인덱스는 B 나무를 사용하여 저장되므로, 데이터 세트의 N 간격이있을 경우,이 O을 얻어 다음 높은 값, O (K가 최초로 일치하는 문서를 조회 할 시간 (N 로그)) 시간이 다음 k 문서를 반복 할 때 총 O (로그 n + k) 시간이됩니다. k이 상수이거나 실제로 O보다 작 으면 (로그 n)이 점은 점근 적으로 최적입니다 (표준 계산 모델에 있음, 외부 메모리 전송 횟수 또는 기타 정보는 계산하지 않음) .
균열이있는 유일한 경우는 k이 큰 경우입니다. 예를 들어 큰 간격에 거의 모든 다른 간격이있는 경우입니다. 이 경우 실행 시간은 O (n)입니다. 데이터가 이와 같이 구조화 된 경우 다른 방법을 사용하는 것이 좋습니다. 한 가지 방법은 당신의 낮은 및 높은 값이 X 및 Y 좌표를 성문화와, 몽고의 "2D"인덱싱을 사용하는 것입니다. 그러면 검색어는 x-y 평면의 특정 지역에있는 지점을 쿼리하는 것과 일치합니다. 비록 2d 인덱싱의 현재 구현에서는 최악의 경우가 여전히 O (n)이지만 이것은 실제로 잘 수행 될 수 있습니다.
는 O 달성 이론적 결과 개수가 K 의 모든 값에 대한 성능 (N 로그)이있다. 우선 순위 검색 트리, 세그먼트 트리, 간격 트리 등의 이름을 사용합니다. 그러나 이들은 사용자가 직접 구현해야하는 특수 용도의 데이터 구조입니다. 내가 아는 한, 현재 널리 사용되는 데이터베이스는 없습니다.