이진 검색은 복잡하지 않으므로 반복자 대신 인덱스 범위를 기반으로 코드를 간단히 코딩하지 않으시겠습니까? 나는리스트가 파이썬의 sequence protocol에 부합한다고 믿는다. 그래서 꽤 쉬워야한다.
실제로 학습을 위해 binary_search()
알고리즘을 사용하려는 경우 Python 시퀀스 맨 위에 STL 스타일 반복기를 만들 수 있습니다. 필요한 것은 시퀀스에 대한 포인터와 무작위 액세스 반복자를 만드는 인덱스입니다. 원하는 경우 목록의 Python 객체를 ID 유형 (일부 정수 유형 일 가능성이 있음)으로 투명하게 변환 할 수도 있습니다.
struct iterator
{
// typedefs required for fully compliant STL-style iterators
typedef PyObject* value_type;
iterator(PyObject* seqeunce, Py_ssize_t position):
m_sequence(sequence), m_position(position)
{
assert(PySequence_Check(m_sequence));
assert(m_position >= 0);
assert(m_position <= PySequence_GetSize(m_sequence));
}
value_type operator*() const
{
assert(m_position < PySequence_GetSize(m_sequence));
return PySequence_GetItem(m_sequence, m_position);
}
iterator& operator++()
{
assert(m_position <= PySequence_GetSize(m_sequence));
++m_position;
return *this;
}
iterator& operator+=(size_t l)
{
m_position += l;
return *this;
}
};
저는 이것을 컴파일하지 않았으며 몇 가지 부분을 잊어 버렸을 것입니다. 두 개의 이터레이터를 초기화하십시오. 하나는 오프셋이 0이고 다른 하나는 컨테이너 크기의 오프셋이 있고, 하나는 binary_search()
입니다.
+1 이것을 반복자로 마무리하는 방법을 보여줍니다. "이진 검색은 그다지 복잡하지 않습니다"라고 말하면서 도널드 크 누스 (Donald Knuth)는 "이진 검색의 기본 아이디어는 비교적 간단하지만 세부 사항은 놀랍도록 까다로울 수 있습니다 ..."라고 말합니다. 이진 검색이 개념적으로 얼마나 단순한 지 상관없이, 사용자 정의 구현을 롤링하는 대신 std :: binary_search를 사용하는 것이 좋습니다. =) – wjl
사실, 바이너리 검색이 완벽하게 올바른 가장 어려운 알고리즘 중 하나 인 [evidence] (http://en.wikipedia.org/wiki/Binary_search#Implementation_issues)가 있습니다. – delnan
정말 고마워, 그게 내가 필요한 힌트 야! https://github.com/zvynar/CModuleForPython에서 작동중인 구현을 찾을 수 있습니다. – zvyn