U E D R , A S I H C RSS

Self-describing Sequence/1002

approach

1ฐจ ‹œ„

Œ€žต —ฐŠตžฅ— ˆ˜—ดด งŒ“ค–ดงˆ ชจŠต„ ƒฐํ•˜ฉด„œ ””žธ, 20„  •„ ฝ””ฉ.


~cpp
def selfDescrib(n):
    table = [1,2,2]
    e=2
    while e!=n+1:
        e+=1
        table += [e] * table[e-1]
        if len(table) > n-1:
            return table[n-1]

for i in [100,9999,123456,1000000000]: print selfDescrib(i)

2ฐจ ‹œ„

ฌธ œŠ”, 1000000000 ˜ ฒฝšฐ— Œ€ํ•ด„œ ‹ตด ‚˜˜คŠ” ‹œ„ด —„ฒญ‚˜ฒŒ ฆฐ‹คŠ”  ด‹ค. ด— Œ€ํ•ด„œ –ด–ปฒŒ ํ•  ฒƒธ€ ณ ,
—ฌŸฌ  ‘ฒ•— Œ€ํ•ด„œ ƒฐํ•˜ฒŒ จ.
  • ˆ˜—ด— Œ€ํ•œ ฐ˜‹ด žˆ„Œ?
  • k ฐ’ Œ€„ f(k) ฐ’„ ํ›จ”ฌ” งŽด •Œ•„‚ ˆ˜ žˆ„ํ…ฐ, ด ดšฉํ•  ฐฉฒ•ด žˆ„Œ?
ทธ™€ € จํ•˜—ฌ ํ”„กœทธž˜ฐ„ „ํ–‰ํ•ดณด•˜œ‚˜ ทธฆฌ „€ —†Œ.

3ฐจ ‹œ„

–ด œ— ด–ด„œ ณ ํ•˜˜ ค‘, ฌธ œ — Œ€ํ•ด„œ ‹ค‹œ ƒฐ. ฒฐตญ€ f(k) œ„ํ•œ table ƒ„—„œ ฉ”ชจฆฌ งŽด “ด‹คŠ”  ด ฌธ œ.
ด— Œ€ํ•ด„œ ‹คฅดฒŒ representation ํ•  ฐฉฒ•„ ƒฐํ•˜‹ค€ ‹คŒ ฐ™ด representation ํ•  ฐฉฒ•„ – ˜ฌฆฌฒŒ จ.
f(1) : 1
f(2) ~ f(3) : 2
f(4) ~ f(5) : 3
f(6) ~ f(8) : 4
f(9) ~ f(11) : 5
.
.

ด— Œ€ํ•ด„œ ‹คŒ ฐ™ด ตฌํ˜„
~cpp
# ํ•ด‹ ˆซž ฒ”œ„ กฐ‚ฌํ•˜—ฌ –ด–ค ฐ’ด ‚˜˜ฌ€ return
def findGroupIdx(table,n,startPos=0):
	for i in xrange(len(table)):
		x,y=table[i]
		if x<=n<=y: return i+1

def selfDescrib2(n):
    table=[(1,1),(2,3)]
    if n==1 or n==2: return n

    for i in xrange(3,n+1):
        start = table[-1][-1] + 1
        theGroupIdx = findGroupIdx(table,i)
        repeat = theGroupIdx
        end = start + repeat - 1
        table.append((start,end))
        if start >= n:
            return findGroupIdx(table,n)

ํ’€ณ  ‚˜‹ˆ, ทธž˜„ —ญ‹œ 1000000000 — Œ€ํ•ด„œŠ” ต‰žฅํžˆ Š. Šฆด €„„ ƒฐํ•˜˜ ค‘ findGroupIdx €„ด
ฌธ œž„„ ƒฐ. ด binary search ตฌํ˜„œกœ ฐ”ฟˆ.
~cpp
def findGroupIdx(table,n,startPos=0):
    midIdx = len(table)/2
    mid = table[midIdx]
    x,y=mid
    if x<=n<=y: return midIdx+1+startPos
    if n<x: return findGroupIdx(table[:midIdx],n,startPos)
    else: return findGroupIdx(table[midIdx+1:],n,startPos+midIdx+1)

binary search กœ ฐ”พธณ  ‚˜„œ„ —ญ‹œ ˜คž˜. ‹คฅธ €ƒ‰ฒ•— Œ€ํ•ด„œ ƒฐํ•˜˜ ค‘, findGroupIdx ํ•จˆ˜ ํ˜ธถœ„ ํ• •Œ ƒฐ.
ˆ˜—ด˜ ฐ’ด Š˜ ฆ€ํ•œ‹ค ํ• •Œ ‹คŒฒˆ— €ƒ‰ํ•˜Š” ฒฝšฐ •ž—„œ €ƒ‰ํ–ˆ˜ ทธ •„‹ˆฉด ทธ ‹คŒ ทธž„„ ƒฐํ•˜ฒŒ จ.
~cpp
class FindGroupIdxs:
    def __init__(self,table):
        self._table = table
        self._prevSearchPos = 0
    def find(self,n):
        while True:
            x,y=self._table[self._prevSearchPos]
            if x<=n<=y: return self._prevSearchPos+1
            self._prevSearchPos+=1

def selfDescrib2(n):
    table=[(1,1),(2,3)]
    if n==1 or n==2: return n

    finder = FindGroupIdxs(table)

    for i in xrange(3,n+1):
        start = table[-1][-1] + 1
        theGroupIdx = finder.find(i)
        repeat = theGroupIdx
        end = start + repeat - 1
        table.append((start,end))
        if start >= n:
            return finder.find(n)

def main():
    import time
    for e in [100,9999,123456,1000000000]: 
        start=time.time()
        print e,selfDescrib2(e)
        print "time : ", time.time()-start

import psyco
psyco.full()
main()

ˆ˜ํ–‰ ‹œ„ : 1000000000 ธฐ€ 0.95ดˆ(with psyco) 2.18ดˆ(without psyco)
ฉ”ชจฆฌ ‚ฌšฉŸ‰ : 31MB

Š‚Œ

  • €† œกœ ํํฌŠค ํŠœ‹„ œ„ํ•ด ‹คฅธ •Œณ ฆฌฆ˜œกœ  ‘„ ํ•ดณธ  ด ข‹•˜Œ.
  • ํ•˜€งŒ, ˆ˜ํ•™ ธ €„ ฐพ•„‚ดŠ”ฐ—Š” —ญ‹œ ํ•œ„ ณดž„. ทธƒฅ ํํฌŠค ํ–ฅƒ„ œ„ํ•œ •Œณ ฆฌฆ˜ ฐœ„ ฒ•œกœงŒ  ‘.
    „ˆฌด ง€—งŒ ˜กดํ•˜—ฌ ํ‘  ด •„‰ฝธด ํ•จ.
  • ‹ค‹œธˆ 'ด ฌธ œ—„œ š”ตฌํ•œ ฐฉฒ•ด ด ฐฉฒ•ด˜€„Œ?' — Œ€ํ•ด„œ ณ ํ•˜ฒŒ จ. „ก ›ํ•˜Š” „Šฅ€ ‚˜˜คธด ํ–ˆ€งŒ.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:00
Processing time 0.0196 sec