Java에서의 TreeMap/HashMap

krondor의 이미지

프로그램 실행속도 개선때문에 고민하다가 질문을 드립니다.

현재는 프로그램 시작 시, 모든 데이터를 배열이나 Vector에 몽땅 집어넣은 후,
프로그램 실행도중 필요한 자료는 for문으로 배열/Vector 전체를 검색하여 찾아내는 식입니다.

그런데 데이터가 워낙 많아지니까 배열/Vector전체를 for문으로 돌리는 시간이 너무 커지네요.

때문에 데이터 전체를 for문으로 뒤질 필요없이,
검색 키 값만으로 바로 접근할 수 있도록 바꾸려고 합니다.
이런 목적으로 TreeMap을 사용하는 것이 맞는지요?

인터넷에 올라온 글들을 보면 TreeMap은 HashMap에 비해 정렬을 지원한다는 말들만 있을 뿐,
이게 key값 검색시 Tree 검색이 이루어진다는 의미인지를 알 수 없어서 질문 드립니다.
즉 HashMap은 key값 검색시 모든 key값을 순차적으로 다 찾아나가고
TreeMap은 key값을 Tree검색을 한다는 의미인건지...

newyorker의 이미지

외부 라이브러리를 사용할 수 있으면 fastutil같은 것을 사용하시면 기본 라이브러리보다 더 빠르구요.

kindler의 이미지

신입이라 잘 모르긴 하지만 교육을 통해서 알고 있는 바로는 벡터는 동기화 처리를 하기 때문에 ArrayList 에 비해 속도가 많이 늦습니다.
강사님께도 프로젝트 나가서 벡터로 코딩했다가 욕만 처먹고 바꿨다고 하시더라고요.

거기에 이용용도가 특정 데이터를 찾는 일이라면 더욱이나 List 계열의 컬렉션 보다 키를 이용한 Map 계열이 훨씬 좋죠.
자료를 안 찾아봐서 모르겠지만 말씀하신것처럼 TreeMap 이 Key 를 정렬해서 가지고 있다면 조회는 빠를 수 있지만 트리에 데이터를 삽입 삭제를 하는 일은 HashMap 보다는 느릴 수 있겠네요.

한번 삽입이후에 데이터 변동이 없다면 TreeMap이(변동이 생길때마다 정렬이 일어날 것임으로)
삽입삭제가 자주 일어난다면 HashMap 이 더 좋지 않을까하는 추측입니다.
뭐 간단한 테스트 코드를 만들어 돌려보시는건 어떨지요..

적어도 키를 쓰는 Map이 반복을 돌려 순차 검색하는 것 보다는 훨씬 적합한 자료구조임은 틀림 없습니다.

익명 사용자의 이미지

지금 vector에 넣는 데이터를 Comparable하게 만든 다음에 (Comparable을 implement해서) TreeSet에 저장해도 되고, 아니면 hashCode() (및 equals() method)를 구현한 다음에 HashSet에다 저장해도 됩니다.

익명 사용자의 이미지

hash는 search / insert / delete 가 O(1) 입니다. tree 는 log(n) 이라고 보시면 됩니다.
특수한 상황이 아니라면 기본적으로는 속도가 문제일 때에는 hash를 쓰는 것이 맞습니다.
tree는 정렬된 key순서로 접근할 수 있다는 장점이 있고, hash에 비해 메모리를 적게 먹습니다.
hash와 tree가 구현이 어떻게 다른지는 자료구조 책을 찾아보시구요.
뭐 굳이 구현을 몰라도 말씀드린 특성만 알고 있으면 사용하는데에는 문제없습니다.

익명 사용자의 이미지

수정~. log(n) 이 아니라 O(log(n)) 입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.