[완료] if else 없이 빨리 찾는 법

sjlee96의 이미지

안녕하세요.
빠른 검색을 위해서 if else문을 쓰지 않고 싶은데 어떻게 방법이 없을까 해서 고수님들께 질문드립니다.

예를 들어,
제가 200도란 각도를 알고 있는데,
동그란 파이가 다음과 같이 나눠져 있습니다.
A: 0<= x <120
B: 120<= x <250
C: 250<= x < 360

물론 if else문을 쓰면 파이 조각 B에 200도가 포함된다는 걸 알고 있는데,
if else를 쓰지 않고 바로 B라는 것을 아는 방법이 없을까요?
이런 A,B,C란 그룹이 수천개가 있으면 일일이 if else로 해서 검색하는 건 상당히 비효율적으로 보이는데,
무슨 방법이 없을지 고수님들께 도움을 요청합니다.
아시는 분 한 수 알려주십시오.
감사합니다.

longfin의 이미지

수식으로 정리될것 같은데요?

sjlee96의 이미지

답변 감사드립니다.
수식으로 정리한다는 것이 잘 이해가 되지 않는데요.
조금 더 자세히 설명해 주실수 없으신지요?

longfin의 이미지

A : 0 ~ 119
B : 120 ~ 239
C : 240 ~ 359

각 구간이 이렇다고 가정했을때 x가 어떤 구간에 속하는지는 요런 구문으로 알 수 있겠지요.

groups = ['A', 'B', 'C']
group = groups[x / 120]

sjlee96의 이미지

무슨 말씀이신지 잘 알겠습니다.
감사드립니다.

select99의 이미지

for(i='A';i<'D';i++) find[i]=max[i]-min[i] >= 200;

sjlee96의 이미지

답변 감사드립니다.
근데, for문을 돌리는 것도 if~else처럼 조건이 맞는 것을 iteration을 통해 찾는 것이기 때문에 차이가 별로 없을 것 같은 생각이 듭니다만, 제가 잘못 알고 있다면 지적해 주십시오.
감사합니다.

select99의 이미지

구체적으로 기존 작성된프로그램이 어떤지 말씀안하셔서 알수 없으나..

보통은 for문이 비효율적이다고 생각하실필요는 없을겁니다.

더좋은답변을 얻으려면 질문이좀더 구체적일 필요가 있겠네요..

수천수만개정도로는 속도지연을 느끼진 못하실겁니다.

차라리 님이기존에 어떻게 if~else 를 통해 구현했느냐를 보여준다면, 아마 쉽게 원하시는 답변을 얻을수 있을겁니다.

sjlee96의 이미지

감사합니다.
사실은 O(1) 검색을 구현하고 있어서요.
사실 몇 천개 더 검색 더 한다고 해서 속도차이가 없는 것은 알고 있지만, for나 if else를 쓰면 조건을 검색한 후 답을 찾는 것이니 O(1)이 안 될 것 같아 드린 질문이었습니다.
아무튼 진심으로 감사드립니다.

select99의 이미지


님의 질문자체로볼때 정렬이없는가정하에서 생각해본다면..O(1) 은 구현되지 않습니다.
O(n) 정도 될겁니다.

또한 선정렬을 가정한다하더라도 O(1) 역시 불가한일입니다.
그게하능하면.. 여테 수많은 DB 들이.. 수억~수십억 하는장비에서 돌고 있지 않겠죠?

bluegene의 이미지

xxx[0..119] = A;
xxx[120..249] = B;
xxx[250..359] = C;

ans = xxx[n]; (0<=n<360)

blue+gene /bluegene.mireene.com/

blue+gene /bluegene.mireene.com/

sjlee96의 이미지

답글 감사드립니다.
배열을 쓰는 것은 정말 좋은 생각인 듯 합니다.
그런데, 249.7같은 실수를 다루는 경우에는 이 방법을 쓸 수가 없을 것 같은데요, 그런 경우에는 어떻게 하는 것이 좋을까요?

예를 들어,
A: 0.0 <= x < 132.3
B: 132.3 <= x < 236.5
c: 236.5 <= x < 360.0

같은 경우에요.
죄송합니다. 진작에 이렇게 질문을 드렸어야 하는데요.
미리 감사드립니다.

bluegene의 이미지

정수화 시켜서 사용할 수도 있겠네요 :)
*= 10
/= 10
(범위체크시에만 *10 한 값을 사용해도 되겠구요)
ㅎㅎㅎㅎ~

blue+gene /bluegene.mireene.com/

blue+gene /bluegene.mireene.com/

sjlee96의 이미지

아.. 네 그렇군요.
메모리를 좀 더 잡아먹긴 하겠지만, 속도 측면에서는 가장 빠르겠네요.
감사드립니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.