- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须创建一个存储事件及其发生概率的类。我正在使用一个字典,将事件作为键,并将事件发生的次数作为值。由此,我可以轻松找到事件的可能性。
from random import randint
class Distribution:
def __init__(self):
self._d = {}
self._events = 0
def add(self,e,multiplicity = 1):
self._d[e] = self._d.get(e,0) + multiplicity
self._events += multiplicity
def count(self,e):
return self._d[e]
def prob(self,e):
return self._d.get(e,0)/self._events
def sample(self):
r = randint(0,self._events)
for key in self._d:
r -= self._d[key]
if r <= 0:
return key
def __len__(self):
return len(self._d)
d = Distribution()
d.add('a')
d.add('a')
d.add('a')
d.add('b')
d.add('b')
d.add('c')
d.prob('a') #returns 1/2
d.prob('b') #returns 1/3
d.sample() #returns a random even based on the probability associated with that event
最佳答案
分析实际方法
让我们考虑一下最坏的情况:
“像从一篮子N个数字中提取特定数字的情况一样,以相同的概率p = 1 / N分配N个事件”。
因此,我们在self._d
中填充了N个键,并且每个键的值均分配为1,而self.events
也是N。
考虑到这一点并调用我们字典的大小,让我们看看您的sample()
方法。
它的成本是“生成指示事件发生的随机整数”加上“循环搜索每个键以查找具有特定值的键”。
假设循环的成本要比生成随机数大得多,现在让我们忽略第二个。
在最坏的情况下,您的循环需要在返回每个键之前先查看每个键,这是因为r
被分配了N个值,因此它花费了O(n*O(self._d[key]))
,而在此简单字典中检索值的成本基于此< aa>,在最坏的情况下为O(n)
。
最后,您的函数将为O(n*O(n))
= O(n ^ 2),而当检索顺利进行时,最终成本将为O(n*O(1))
= O(n)。在收取O(logn)
费用的dict实施中,就像您说的最终费用将是O(nlogn)。
可能的解决方案
考虑到先前的推理,如果我们发现在python中使用常量成本O(1)来实现字典检索的关键实现,则将方法成本降低到O(n),这比O(n ^ 2)更有效)。
这些是我可以加快函数速度的方法,但是由于r
在最坏的情况下,我们在返回每个键之前都会循环每个键,因此它永远不会是O(logn)。
例如,假设我们在插入一些字典后d1 = {"a":1, "b":1, "c":1}
和randint()
分配r=3
。现在将要发生的是,我们取一个键,也许是b并减去它的值,导致r = 2不会通过if条件,因此不会通过下一个,但是最后一个是。因此,使用像d1这样的大词典,您将在n个元素上循环。
但是,如果您希望该示例返回一个事件,该事件具有价值,那么您所生成的第一个因果r
比我拥有的解决方案包括使用二进制搜索。
对于这些,让我们使用一些支持结构来显示两个Python列表:一个用于维护插入的键(我现在将其称为标签),另一个用于维护将调用数据的值。
要订购数据列表,也要使用现代标签,因此字典(键,值)对组件将位于两个列表的相同位置,然后使用“二进制搜索”在O(logn)中查找r
,并使用创建位置返回标签列表中的相应键。
以下是我的代码,该代码需要导入要工作的模块,提示如何通过值source排序字典的输出。
def fastSample(self):
#supporting data structures
labels = [] #to contain the keys
data = [] #to contain the values
#retrieving the pairs in the dictionary
#ordered by values
ordered_pairs = sorted(self._d.items(), key=operator.itemgetter(1))
#Having our ordered list o pairs by value
#I split it in two lists
for pair in ordered_pairs:
labels.append(pair[0])
data.append(pair[1])
r = choice(data) #take a random number between the possible values
index = binarySearch(data,r)
print(index)
return labels[index]
r
查找密钥,但是相对于之前,现在需要确保返回的数字是我们字典的值。为此,必须使用
random.choice()
,它将从数据列表中随意选择一个数字作为字典中的值。
sorted()
函数有一个我不知道的开销,但是我确信充其量是
O(n)
或
O(nlogn)
看到排序算法
here的开销,因为它比搜索我们使用的fastSample()的成本将是排序的成本。
__init__
中的实例变量一样。现在,添加事件时,我们必须修改列表,因此它们始终是有序的。
fastSample()
将像您想要的那样花费O(logn)。根据情况,唯一的问题可能是,对于每个键二进制搜索都具有相同的值将返回列表中心的元素。
labels: ['e', 'f', 'h', 'c', 'a', 'b']
data: [1, 1, 1, 2, 6, 7]
r = 7
Lucky one is: b
labels: ['e', 'f', 'h', 'c', 'a', 'b']
data: [1, 1, 1, 2, 6, 7]
r = 1
Lucky one is: h
labels: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'q']
data: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
r = 1
Lucky one is: h
关于python - 如何使用字典将随机采样函数的性能从O(n)提高到O(logn)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53180500/
我正在寻找一种方法来对数字进行 1:40、3812 次(长度 = 3812)的采样,并进行替换 - 但对其进行限制,使每个数字的使用次数不会超过 100 次。有没有办法在采样命令 (sample())
如果我想随机采样 pandas 数据帧,我可以使用 pandas.DataFrame.sample . 假设我随机抽取 80% 的行。如何自动获取另外 20% 未选取的行? 最佳答案 正如 Lager
我使用以下函数在每个图像中采样点。如果batch_size为None,tf.range会给出错误。如何在 tensorflow 中采样 def sampling(binary_selection,nu
我想知道是否有任何方法可以循环浏览 .wav 文件以获取 wav 文件中特定点的振幅/DB。我现在正在将它读入一个字节数组,但这对我来说没有任何帮助。 我将它与我开发的一些硬件结合使用,这些硬件将光数
我有一个日期时间的时间序列,双列存储在 mySQL 中,并且希望每分钟对时间序列进行采样(即以一分钟为间隔提取最后一个值)。在一个 select 语句中是否有一种有效的方法来做到这一点? 蛮力方式将涉
我正在为延迟渲染管道准备好我的一个小型 DirectX 11.0 项目中的一切。但是,我在从像素着色器中对深度缓冲区进行采样时遇到了很多麻烦。 首先我定义深度纹理及其着色器资源 View :
问题出现在量子值的样本上。情况是: 有一个表支付(payments): id_user[int] sum [int] date[date] 例如, sum(数量) 可以是 0 到 100,000 之间
这是一个理论问题。我目前正在研究渲染方程,我不明白在哪种情况下区域采样或半球采样更好以及为什么。 我想知道的另一件事是,如果我们采用两种方法的平均值,结果是否会更好? 最佳答案 Veach 和 Gui
我有一个 4x4 阵列,想知道是否有办法从它的任何位置随机抽取一个 2x2 正方形,允许正方形在到达边缘时环绕。 例如: >> A = np.arange(16).reshape(4,-1) >> s
我想构建 HBase 表的行键空间的随机样本。 例如,我希望 HBase 中大约 1% 的键随机分布在整个表中。执行此操作的最佳方法是什么? 我想我可以编写一个 MapReduce 作业来处理所有数据
当像这样在 GLSL 中对纹理进行采样时: vec4 color = texture(mySampler, myCoords); 如果没有纹理绑定(bind)到 mySampler,颜色似乎总是 (0
我考虑过的一些方法: 继承自Model类 Sampled softmax in tensorflow keras 继承自Layers类 How can I use TensorFlow's sampl
我有表clients,其中包含id、name、company列。 表agreements,其中包含id、client_id、number、created_at列. 一对多关系。 我的查询: SELEC
在具有许多类的分类问题中,tensorflow 文档建议使用 sampled_softmax_loss通过一个简单的 softmax减少训练时间。 根据docs和 source (第 1180 行),
首先,我想从三个数据帧(每个 150 行)中随机抽取样本并连接结果。其次,我想尽可能多地重复这个过程。 对于第 1 部分,我使用以下函数: def get_sample(n_A, n_B, n_C):
我正在尝试编写几个像素着色器以应用于类似于 Photoshop 效果的图像。比如这个效果: http://www.geeks3d.com/20110428/shader-library-swirl-p
使用 Activity Monitor/Instruments/Shark 进行采样将显示充满 Python 解释器 C 函数的堆栈跟踪。如果能看到相应的 Python 符号名称,我会很有帮助。是否有
我正在使用GAPI API来访问Google Analytics(分析),而不是直接自己做(我知道有点懒...)。我看过类文件,但看不到任何用于检查采样的内置函数。我想知道使用它的人是否找到了一种方法
我正在尝试从 Peoplesoft 数据库中随机抽取总体样本。在线搜索使我认为 select 语句的 Sample 子句可能是我们使用的一个可行选项,但是我无法理解 Sample 子句如何确定返回的样
我有一个程序,在其中我只是打印到 csv,我想要每秒正好 100 个样本点,但我不知道从哪里开始或如何做!请帮忙! from datetime import datetime import panda
我是一名优秀的程序员,十分优秀!