查看: 13621| 回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

Python 的 treemap

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
python里没有按key排序的字典,类似于Java里treemap那种,导致很麻烦。
研究了一下,用heapq或者bisect都没法模拟treemap,关键是remove操作没法做到O(logn). 第三方库倒是有,但是没法在Online Judgement上用。
跪求各位python大佬的解决办法~

上一篇:求问大家工作之后还刷不刷题啊
下一篇:分享经典算法和数据结构的实现
推荐
random_zero 2018-6-26 20:55:49 | 只看该作者
全局:
白板你可以唬烂一个,面试官非得让你写的话也行,基本就是wrap一个heapq,删除时记录删除次数,pop时如果当前值已经被删过那就继续pop。。如果面试官看见python就鄙视,可能是面试官水平不够吧,之前面亚麻碰到过两次

评分

参与人数 1大米 +1 收起 理由
an7hee + 1 头像吓一跳

查看全部评分

回复

使用道具 举报

🔗
idatascience 2018-6-23 08:40:04 | 只看该作者
全局:
1,自己写(但在面试的时候,不现实)

补充内容 (2018-6-23 08:41):
没写完,就发出来了。2,据说这种情况下可以用less optimal的数据结构,面试官心里也有数的。
回复

使用道具 举报

🔗
gzxultra 2018-6-23 09:48:54 | 只看该作者
全局:
楼主可以参考,

In [20]: from collections import OrderedDict

In [21]: values = list(range(0, 10))

In [22]: OrderedDict({values[i]: values[::-1][i] for i, k in enumerate(values)})
Out[22]:
OrderedDict([(0, 9),
             (1, 8),
             (2, 7),
             (3, 6),
             (4, 5),
             (5, 4),
             (6, 3),
             (7, 2),
             (8, 1),
             (9, 0)])


补充内容 (2018-6-26 19:00):
啊,不好意思没审题
回复

使用道具 举报

🔗
wowmomsos 2018-6-23 09:49:51 | 只看该作者
全局:
你换成java语言不得了,非得拘泥一个?
回复

使用道具 举报

全局:
不是有lambda expression? 我查查。。
回复

使用道具 举报

🔗
umialpha 2018-6-25 14:43:09 | 只看该作者
全局:
daddev 发表于 2018-6-25 13:39
用python做题,不会被鄙视吗?

肯定不会啊。面试也有鄙视链的么
回复

使用道具 举报

🔗
daddev 2018-6-26 12:43:03 | 只看该作者
全局:
umialpha 发表于 2018-6-25 14:43
肯定不会啊。面试也有鄙视链的么

反正我面试的时候,要是candidate用Python,我第一反应就是:这哥们儿适合做SRE/OPS.

补充内容 (2018-6-26 12:45):
几年前,或者早期Start up用python写后端最近还是很普遍的,上手快,出活儿。面试主要考察思路和代码,但是用python感觉还是很怪。
回复

使用道具 举报

🔗
magicsets 2018-6-26 16:08:53 | 只看该作者
全局:
糊了一个简易实现,不过元素数量上10^5 ~ 10^6之后就性能爆炸了...

  1. class TreeNode:
  2.     def __init__(self, slots = None, links = None):
  3.         self.slots = slots or []
  4.         self.links = links or [None]

  5.     def getKey(self, pos):
  6.         return self.slots[pos][0]

  7.     def insertSlot(self, pos, slot, link, degree):
  8.         self.slots.insert(pos, slot)
  9.         self.links.insert(pos, link)
  10.         sibling = popup = None
  11.         if len(self.slots) > degree * 2:
  12.             # Split
  13.             sibling = TreeNode(self.slots[:degree], self.links[:degree+1])
  14.             popup = self.slots[degree]
  15.             self.slots = self.slots[-degree:]
  16.             self.links = self.links[-degree-1:]
  17.         return (slot, sibling, popup)

  18. # B Tree.
  19. class TreeMap:
  20.     def __init__(self, degree = 8):
  21.         self.degree = degree
  22.         self.root = TreeNode()
  23.         self.size = 0

  24.     def __setitem__(self, key, value):
  25.         slot = self._locateSlot([], self.root, key, True)
  26.         slot[1] = value
  27.         if not slot[2]:
  28.             slot[2] = True
  29.             self.size += 1

  30.     def __getitem__(self, key):
  31.         slot = self._locateSlot([], self.root, key, False)
  32.         if slot is None or not slot[2]:
  33.             raise Exception('key "' + str(key) + '" does not exist')
  34.         return slot[1]

  35.     def __len__(self):
  36.         return self.size

  37.     def pop(self, key):
  38.         # Mark as deleted
  39.         slot = self._locateSlot([], self.root, key, False)
  40.         if slot is not None and slot[2]:
  41.             slot[2] = False
  42.             self.size -= 1
  43.             return slot[1]
  44.         return None

  45.     def range(self, lower_bound, upper_bound):
  46.         for slot in self._traverse(self.root, lower_bound, upper_bound):
  47.             if slot[2]:
  48.                 yield (slot[0], slot[1])

  49.     def _traverse(self, node, lower_bound, upper_bound):
  50.         size = len(node.slots)
  51.         begin = next(i for i in range(size+1) if i == size or node.getKey(i) >= lower_bound)
  52.         for i in range(begin, size+1):
  53.             if node.links[i] is not None:
  54.                 for slot in self._traverse(node.links[i], lower_bound, upper_bound):
  55.                     yield slot
  56.             if i == size or node.getKey(i) > upper_bound:
  57.                 break
  58.             yield node.slots[i]

  59.     def _locateSlot(self, ancestors, node, key, insert):
  60.         size = len(node.slots)
  61.         pivot = next(i for i in range(size + 1) if i == size or key <= node.getKey(i))
  62.         if pivot != size and node.getKey(pivot) == key:
  63.             return node.slots[pivot]
  64.         child = node.links[pivot]
  65.         ancestors.append((node, pivot))
  66.         return self._locateSlot(ancestors, child, key, insert) if child is not None \
  67.           else self._insertSlot(ancestors, [key, None, False], None) if insert \
  68.           else None

  69.     def _insertSlot(self, ancestors, slot, link):
  70.         node, pos = ancestors.pop()
  71.         slot, sibling, popup = node.insertSlot(pos, slot, link, self.degree)
  72.         if sibling is not None:
  73.             if len(ancestors) == 0:
  74.                 self.root = TreeNode([popup], [sibling, node])
  75.             else:
  76.                 self._insertSlot(ancestors, popup, sibling)
  77.         return slot


  78. # Example.
  79. from sys import stdout

  80. tree = TreeMap()
  81. tree["A"] = 1
  82. tree["B"] = 2
  83. tree["C"] = 3
  84. tree["D"] = 4
  85. tree["E"] = 5
  86. tree["F"] = 6
  87. tree["G"] = 7

  88. stdout.write("Before, # of entries = " + str(len(tree)) + "\n")

  89. tree.pop("C")
  90. tree.pop("E")

  91. stdout.write("After, # of entries = " + str(len(tree)) + "\n")

  92. for key, value in tree.range("B", "F"):
  93.     stdout.write("[" + key + "]: " + str(value) + "\n")
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表