수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694873
  • Today | 618
  • Yesterday | 606

1 Articles, Search for 'upper_bound'

  1. 2007/03/08 upper_bound/lower_bound
Programming/C++2007/03/08 09:55

upper_bound/lower_bound

원본 : http://www.debuglab.com/knowledge/upperbound.html

1.요약

C++ Standard Library의 정렬과 탐색 관련 함수 입니다.

필요하신 경우 한, 두줄의 코드를 적어주는 것 만으로도 가장 뛰어난 개발자들에의해 제작되고 테스트된 탐색 기능을 사용하실 수 있습니다


2.본문

이전 Tip에서는 O(logN)의 시간복잡도를 자랑하는 binary_search 에 대해서 알아보았습니다. binary_search 함수의 문제점은 원소가 컨테이너( 배열이나 리스트 등등..)안에 존재하는지의 유무(bool)만 반환하는 것이었으므로, 살짝 소스를 고쳐서 원소의 위치를 반환하도록 기능을 바꾸어봤습니다.

하지만 원소의 위치를 반환하는 기능이 없을리가 없겠죠. 원소의 위치를 반환하는 함수에는 upper_bound와 lower_bound가 있는데 우선은 예제를 함께 살펴보시죠.

---- upper_bound/lower_bound를 사용하는 예제 ----------

1    #include <algorithm> 

2    #include <iostream> 

3     

4    using namespace std; 

5     

6    int main(int argc, char* argv[]) 

7    { 

8        int arr[10] = {2, 6, 10, 15, 16, 17, 28, 30, 50, 52}; 

9     

10        int* pRetLowerBound = lower_bound( &arr[0], &arr[10], 16); 

11        int* pRetUpperBound = upper_bound( &arr[0], &arr[10], 16); 

12     

13        cout << "*** LowerBound ***\n"; 

14        cout << "index = " << pRetLowerBound - arr << "\n"; 

15        cout << "*pRet = " << *pRetLowerBound << endl; 

16     

17        cout << "*** UpperBound ***\n"; 

18        cout << "index = " << pRetUpperBound - arr << "\n"; 

19        cout << "*pRet = " << *pRetUpperBound << endl; 

20     

21        return 0; 

22    } 


-- 실행 결과 ---------------------------------------------

*** LowerBound ***
index = 4
*pRet = 16
*** UpperBound ***
index = 5
*pRet = 17
Press any key to continue


-- 예제 분석 ---------------------------------------------

1    #include <algorithm> 

2    #include <iostream> 

3     

4    using namespace std; 

C++ Standard Library 를 사용하기 위한 준비를 합니다.
upper_bound와 lower_bound는 algoritms 헤더에 있습니다.
iostream을 화면에 결과를 출력하기 위해서 추가했습니다.

-----------------------------------------------------------

8        int arr[10] = {2, 6, 10, 15, 16, 17, 28, 30, 50, 52}; 
아시다시피 binary search 를 수행하시려면 정렬된 데이타가 필요합니다. 잘 정렬된 int 배열이 있습니다.( 기회가 되면 다음 번엔 한 두줄로 끝나는 정렬에 대해서 살펴보도록 하죠)

-----------------------------------------------------------

10        int* pRetLowerBound = lower_bound( &arr[0], &arr[10], 16); 
lower_bound 를 사용하고 있습니다. 매개변수는 3개가 필요한다. 두 개는 검색할 범위를 나타내고, 하나는 검색할 값을 나타냅니다.

STL 에서 범위를 표시하는 법은 다음과 같습니다.
시작위치 - 첫번째 원소의 주소(혹은 iterator)
마지막 위치 - 마지막 원소의 다음 원소의 주소(혹은 iterator)

마지막 위치를 지정하는 방식이 조금 특이하지만 참 유용한 방식이라는 생각이 듭니다.

다시 Line 10을 보시면서 방금 배운 내용을 적용시켜 본다면, 배열의 첫번째 원소는 a[0] 이므로 &a[0]을 넘겨주었고 마지막 원소는 a[9] 이므로 &a[10]을 넘겨주었습니다.

검색하고 싶은 값은 16입니다.

upper_bound의 경우도 사용법은 같습니다.

-----------------------------------------------------------------

나머지 코드는 단순히 결과를 출력하는 것이므로 설명은 생략하겠습니다.

upper_bound와 lower_bound 가 반환하는 값을 살펴보자면, upper_bound는 우리가 찾고자 하는 16을 지나쳐 다음 원소의 위치를 반환했습니다.

lower_bound는 우리가 찾고자 하는 16의 위치를 올바르게 반환했습니다.

lower_bound와 upper_bound의 설명은 MSDN에 나와있지만 제 실력으로는 그 의미를 추론해내기가 힘들더군요.

하지만 다른 많은 서적에는 그 의미를 훌륭하게 설명해주고 있습니다.

즉, 정렬된 컨테이너에( 다시.. 배열이나 리스트 등을 의미합니다) 새로운 원소를 대입하고 싶을때, 새 원소가 정렬을 흐트리지 않고 삽입될 수 있는 최소 경계와 최대 경계를 반환한다고 말입니다.


3.예제



4.참고

다음 함수들과 관련이 있습니다.

Binary_search, equal_range



- 2001.08.13 Smile Seo -
"C++" 카테고리의 다른 글
  • based addressing (0)2007/03/17
  • stringstream (0)2007/03/08
  • upper_bound/lower_bound (0)2007/03/08
  • auto_ptr (0)2007/03/05
  • 템플릿을 이용한 동기화 클래스 만들기 (0)2007/03/05
2007/03/08 09:55 2007/03/08 09:55
Posted by webdizen
Tags lower_bound, upper_bound
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2682

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 터미널 장치 파일
  • Linux Kernel
  • 세션빈
  • ComboBox
  • Monitoring
  • 인덱스 재생성
  • 컨트롤
  • Bookmarking
  • 아이팟
  • 소스 코드 공유
  • 국가대표
  • 비만
  • Introduction to SQL
  • 데이터 분산
  • XML
  • DSS
  • 올림픽 공원
  • 확장성
  • 패킷 캡처
  • 충돌 관리

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 경청... 너무나 중요한데.......
    webdizen 14:59
  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Polarux - Linuxing
      • Rodman®
      • 까만 나비
      • 나를 가꾸는 시간.
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.