在我遇到的情况下,我想定义"优雅"具有 1)常数O(1)时间复杂度用于检查项目是否存在且 2)仅存储项目,仅此而已。
例如,如果我使用列表
num_list = []
for num in range(10): # Dummy operation to fill the container.
num_list += num
if 1 in num_list:
print("Number exists!")
操作" in"根据[Link]
, O(n)时间为了实现不断的检查时间,我可以使用字典
num_dict = {}
for num in range(10): # Dummy operation to fill the container.
num_dict[num] = True
if 1 in num_dict:
print("Number exists!")
在字典的情况下,操作"在"根据[Link],费用 O(1)时间,但存储虚拟值需要额外的 O(n)存储空间。因此,两个实现/容器似乎都不优雅。
什么是更好的实现/容器来实现持续O(1)时间来检查项目是否存在而仅存储项目?如何将资源需求保持在最低限度?
答案 0 :(得分:1)
这里的解决方案是使用import numpy as np
import pandas as pd
from sklearn import linear_model, metrics, pipeline, preprocessing
df = pd.DataFrame({'a':range(12), 'b':[1,2,3,1,2,3,1,2,3,3,1,2], 'c':['a', 'b', 'c']*4, 'd': ['m', 'f']*6})
y = df.a
num = df[['b']]
cat = df[['c', 'd']]
from sklearn.feature_extraction import DictVectorizer
enc = DictVectorizer(sparse = False)
enc_data = enc.fit_transform(cat .T.to_dict().values())
crat = pd.DataFrame(enc_data, columns=enc.get_feature_names())
X = pd.concat([crat, num], axis=1)
cat_columns = ['c=a', 'c=b', 'c=c', 'd=f', 'd=m']
cat_indices = np.array([(column in cat_columns) for column in X.columns], dtype = bool)
numeric_col = ['b']
num_indices = np.array([(column in numeric_col) for column in X.columns], dtype = bool)
reg = linear_model.SGDRegressor()
estimator = pipeline.Pipeline(steps = [
('feature_processing', pipeline.FeatureUnion(transformer_list = [
('categorical', preprocessing.FunctionTransformer(lambda data: data[:, cat_indices])),
#numeric
('numeric', pipeline.Pipeline(steps = [
('select', preprocessing.FunctionTransformer(lambda data: data[:, num_indices])),
('scale', preprocessing.StandardScaler())
]))
])),
('model', reg)
]
)
estimator.fit(X, y)
,它不需要为每个值保存虚拟变量。
答案 1 :(得分:0)
通常,您无法同时优化空间和时间。你可以做的一件事是有关于数据范围的更多细节(这里是num的最小值到最大值)和数据大小(这里是循环运行的次数,即10。)。那么你将有两个选择:
如果您选择正确的方法,那么您可能会获得大样本的恒定时间和空间
编辑: 设置强> 它是一个哈希表,与Python字典非常类似地实现了一些优化,这些优化利用了值总是为空的事实(在集合中,我们只关心键)。集合操作确实需要对至少一个操作数表进行迭代(在union的情况下都是如此)。 迭代并不比任何其他集合(O(n))便宜,但成员资格测试平均为O(1)。