Question 1000258: NP-hard是什么意思

算法/数据结构/数据库 计算复杂度

NP-hard到底是什么意思?我不是学计算机的,但是遇到了这个概念。有没有简单一点的解释,网上的意思都好复杂。


多谢!


Answer

Answer 1:

P:能够以多项式时间被求解的问题称为P-问题。比如说O(n),O(n^5),这都是多项式时间。

举个例子,给n个数,找出其中所有的偶数。这个就是P-问题。


NP:首先NP-问题不能以多项式的时间求解;并且,如果我们假设找到了一个答案,这个答案可以以多项式的时间检验该答案是否正确。

比如说,我们要找出所有(1,2,3)的置换,并且第一个元素小于第二个元素。这里一共有3!=3*2*1=6个置换,(1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1),符合第一个元素小于第二个元素的置换有3个。如果是(1,2,...,n)的置换,我们则需要至少O(n!)的时间来求解,这是大于多项式时间的。再者,如果给出任意一个备选答案,比如(5,2,1,4,3),我们只需要花多项式的时间(这里是O(n)时间)来检查这个备选答案是不是真的是一个置换并且第一个元素小于第二个元素。


NP-hard:首如果一个问题通过一些步骤能够化简为一个NP问题,那么这个问题就是NP-hard问题。换句话说,至少是NP的问题称之为NP-hard问题。

著名的NP-hard例子就是旅行商问题。假设有n个城市,找出一条每个城市都访问一次且仅访问一次的最短路线。



Question 1003850: python里list的remove和pop方法的时间复杂度是多少?

算法/数据结构/数据库 Python 计算复杂度

python里list的remove和pop方法的时间复杂度是多少?

remove是用来删除指定数值的元素

my_list.remove(val)

pop是用来删除指定位置的元素,比如下面就是删除第一个

my_list.pop(0)

它们都是$O(n)$的吗?还是$O(1)$的?


Answer

Answer 1:

就我知道的 :

.remove(value)  --> O(n)

.pop(index) --> O(n-index)

说明下, O(pop())可能一开始由于index查找的原因会误以为是O(1),但其实在完成删除这个步骤之后,所有在这个被删除位置之后的元素的index都会被向前移一位, 或者说向前补充。 并且pop()最后会返回被删除的元素值。  

remove()就很直接了, 从第0个元素找起, 直到找到第一个match的元素并删除(不会像pop一样返回被删掉元素的值), 然后剩余元素向前补充。 


Question 1004309: python中defaultdict的用法

算法/数据结构/数据库 Python

我有个关于defaultdict的疑问,我的理解是如果key不存在,defaultdict可以帮你返回一个你预设的值,比如0,而不是直接报错。我试着用了defaultdict,但是报错,不大理解defaultdict的用法。

>>> from collections import defaultdict

>>> my_dict = defaultdict(0)

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

 in ()

      1 from collections import defaultdict

----> 2 my_dict = defaultdict(0)



TypeError: first argument must be callable or None


Answer

Answer 1:


from collections import defaultdict
mydict = defaultdict(lambda: 0)

然后你call一个不存在的key,得到的就是0

Answer 2:

你去看看Python doc有注释,必须是可调用或者是None


Question 1005471: python中如何合并两个dict

算法/数据结构/数据库 Python

假设有两个dict,并且它们的key是没有交集的,比如

A = {'a': 1, 'b': 2}

B = {'c': 1, 'd': 2}

怎么对它们进行合并?得到如下的新的dict

C = {'a': 1, 'b': 2, 'c': 1, 'd': 2}

谢谢各位!


Answer

Answer 1:


dict(A,**B)
Answer 2:


A.update(B)

Question 1005553: 1000个瓶子和10个小白鼠的算法题

算法/数据结构/数据库 计算复杂度 空间复杂度

现在有1000个看上去一模一样的瓶子,其中999瓶里装的是水,1瓶是毒药,只要喝下一滴,就会在一个星期之后死亡。

现在给你10只小白鼠和一星期的时间,如何检测出哪个瓶子装的是毒药?

一道面试,求解答,谢谢各位了!


Answer

Answer 1:

这是道编码题,而且$2^{10}=1024$,会想到二进制编码。先瓶子编号向量$X$为00_0000_0000到11_1110_0111。老鼠喝水操作的矩阵$A$,第一行$A_{1*}=$10_0000_0000,表示一号老鼠喝所有$X=$1x_xxxx_xxxx的水,x表示0和1都喝。$Y_1=A_{1*}X$用于标志从左到右的$X$第一位是0或1。第二行$A_{2*}=$01_0000_0000,表示一号老鼠喝所有$X=$x1_xxxx_xxxx的水。以此类推。

老鼠死掉的编码$Y$就是毒药瓶子的编码,因为$A=I$。比如0号瓶是毒药,$Y$=00_0000_0000;如果1号瓶是毒药,$Y$=00_0000_0001。1代表老鼠死掉。每个瓶子对应唯一的$Y$。

$Y=AX$

进一步,只要$A$是正交基,$X$通过$A$投影,有唯一$Y$对应。


Question 1005578: 怎么在pyspark中查看一个表格的partition?

算法/数据结构/数据库 Spark

怎么在pyspark中查看一个表格的partition?

d = spark.table('db.tbl_merchandise')

上面的表格d,然后怎么查看d的partition呢?


Answer

Answer 1:


spark.sql('SHOW PARTITIONS db.tbl_merchandise').show()

Question 1005638: 怎么在python中复制指定路径下的文件?

算法/数据结构/数据库 Python

当前目录下有个文件是a.txt,怎么用python把这个文件复制到路径folder_a/b.txt?


Answer

Answer 1:


import shutil

src = 'a.txt'

dst = 'folder_a/b.txt'

shutil.copyfile(src, dst)

Question 1005723: pyspark里怎么把类似‘yyyy-mm-dd‘的字符串转成星期几的形式?

算法/数据结构/数据库 Spark

比如表里有一列date_str是yyyy-mm-dd字符串形式的日期,怎么把这列转成星期几的形式?


Answer

Answer 1:

先引用一下F

from pyspark.sql import functions as F

然后用下面的表达式提取星期几

F.from_unixtime(F.unix_timestamp(F.col('date_str'), 'yyyy-mm-dd'), 'u')

得到1到7的整数,1是星期一,2是星期二,等等等


Question 1005750: beam search是什么意思?

算法/数据结构/数据库 计算复杂度

beam search是什么意思?


Answer

Answer 1:

beam search在nlp以及sequence modeling还是经常出现的。

假如我们要从上十万个元素中寻找4个元素$Y_1,\cdots,Y_4$使得$P(Y_1,Y_2,Y_3,Y_4|X)$最大,如果要找精确解,我们就要遍历所有的组合,也就是$\binom{10^6}{4}$,大概是$10^{15}$,天文数字,不可能去遍历的。

所以,我们通常找到一个$Y1$,使得$P(Y_1|X)$最大,然后根据

$$P(Y_1,Y_1|X)=P(Y_2|X,Y_1)P(Y_1|X)$$

再去寻找$Y_2$,使得$P(Y_2|X,Y_1)$最大。此次类推,按照这种贪婪算法,我们就能找到$Y_1,\cdots,Y_4$,搜寻次数只需要$4\times 10^6$。

但是显然这样的贪婪搜索不能保证最优性,甚至都无法达到较优。beam search就是对贪婪算法的改良。

beam就是带宽。当beam=3的时候,我们每次保留三个最佳候选然后再进行下一步迭代。

下图就是beam为3的一个搜索树,我们从左往右搜索,每次搜索的最佳的三个点用红色标注。



Question 1005758: 如何创建numpy二维数组,边框四周的元素都为1,内部元素都为0 ?

算法/数据结构/数据库 Python

如何创建numpy二维数组,边框四周的元素都为1,内部元素都为0 ,如下图

要求是输入矩阵的边长n,返回一个nxn的上面的矩阵。昨天面试的题目,感觉答得不好,谢谢老铁们!


Answer

Answer 1:

挺有意思的题目,我自己用两种方法做了一下

第一个方法是生成一个全零的矩阵,然后对四个边重新赋值为1

def func1(n):
    arr = np.zeros([n] * 2)
    arr[[0, -1], :] = 1
    arr[:, [0, -1]] = 1
    return arr

第二个方法是生成一个全一的矩阵,然后对中心区域重新赋值为0

def func2(n):
    arr = np.ones([n] * 2)
    arr[1:-1, 1:-1] = 0
    return arr

第二个方法的代码少一行,但是我自己试了一下对于大矩阵,比如n>1000,方法一明显快不少,矩阵越大快的越明显。应该是方法一更好。


比较时间的代码:

t0 = time.time()
for i in range(100):
    func1(5000)  
t1 = time.time()
for i in range(100):
    func2(5000)  
t2 = time.time()
print(t1-t0, t2-t1)
1.3369219303131104 13.74842095375061

Question 1005881: hive里的LEFT SEMI JOIN是什么JOIN?

算法/数据结构/数据库 Hive

从没有听说过semi join


Answer

Answer 1:

用法如下

SELECT * FROM tab1 LEFT SEMI JOIN tab2 ON (tab1.id = tab2.id);

left semi join和left outer join相似,也和inner join有点相似。但left semi join只返回tab1中的列,不是完整的join,所以是semi join

和left outer join相似:因为left semi join只返回左表里的

和inner join相似:因为left semi join不返回右边里没有的

比如tab1,tab2是

它们inner join的结果是

它们left join的结果是

它们left semi join的结果是

因为表tab1中只有一个id=2,尽管tab2中有多个id=2,我们也只匹配一个,最后返回的时候只得到tab1中的列



Question 1005947: python中怎么对一组逻辑变量求“或”?

算法/数据结构/数据库 Python

python中怎么对一组逻辑变量求“或”?

比如一个列表x,里面有10个元素,x=[x1, x2, ...],如果要对所有的元素求或运算,就需要写很长的式子

x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10

有什么简便的方法吗?


Answer

Answer 1:

对于或运算,只要有一个是True,整个就是True了

>>> x = [True, False, True, False, False]

>>> True in x

True

也可以看整个list中的最大值

>>> x = [True, False, True, False, False, False, False]

>>> max(x)

True
Answer 2:

也可以用numpy的any函数


Examples
--------
>>> np.any([[True, False], [True, True]])
True

>>> np.any([[True, False], [False, False]], axis=0)
array([ True, False])

>>> np.any([-1, 0, 5])
True

>>> np.any(np.nan)
True

>>> o=np.array([False])
>>> z=np.any([-1, 4, 5], out=o)
>>> z, o
(array([ True]), array([ True]))
>>> # Check now that z is a reference to o
>>> z is o
True
>>> id(z), id(o) # identity of z and o              # doctest: +SKIP
(191614240, 191614240)



Question 1005948: 树的inorder traversal是什么意思?

算法/数据结构/数据库 计算复杂度 空间复杂度

树的inorder travesal是什么意思?为什么下面那个树的结果是[1, 3, 2]?



Answer

Answer 1:

inorder traversal是对树的中序遍历,顺序是 左子树 => 根 => 右子树

上面的例子中,左子树是空,根是1。在右子树中左子树是3,根是2,右子树是空。合在一起就是1,3,2。

上面这个例子中中序遍历是4->2->5->1->3。


Question 1005959: python的set进行append操作?

算法/数据结构/数据库 Python

python的list可以进行append操作,也就是在尾部添加一个元素。

python里的set有没有添加元素的操作?


Answer

Answer 1:

set是一个无序且元素唯一的数据结构,只用add操作没有append的操作。

Answer 2:


a = {1, 2}

s.add(3)

Question 1006031: python中怎么获取cpu的个数?

算法/数据结构/数据库 Python

有的电脑是4个cpu有的是8个,在python中什么命令可以获得本机的cpu的个数?


Answer

Answer 1:


import os
num_cpu = os.cpu_count()

Question 1007624: Python Packaging 的最佳实践?

算法/数据结构/数据库

Python Package 是个老大难问题. 请问有哪些指导性意见可以参考呢?


Answer


Question 1007625: pyspark里怎么查看一个dataframe的schema?

算法/数据结构/数据库 Spark

pyspark里怎么查看一个dataframe的schema?


Answer

Answer 1:

如果要查看sql_df的schema可进行如下操作

sql_df.printSchema()



Question 1007633: pyspark获取当月的最后一天的日期?

算法/数据结构/数据库 Spark

比如我的pyspark sql dataframe里有一列日期

dates

2020-01-20

2020-01-25

2020-02-01

2020-02-29


我想返回的是加工后的一列,这一列对应着每一行中dates日期所在的月的最后一天。比如上面的结果应该是

last_day_a_month

2020-01-31

2020-01-31

2020-02-29

2020-02-29


在pyspark里我该怎么操作?


Answer

Answer 1:

先引用一下pyspark的functions

import pyspark.sql.functions as F

然后用Functions中的last_day函数就可以得到当月的最后一天

select(F.last_day(F.col('dates')).alias('last_day_of_month'))



Question 1022134: 怎么用pyspark取出hive表里的json串中某一个key的值?

算法/数据结构/数据库 Spark Hive

比如一个hive表里有id, field1, field2这些字段,field2是一个很长json串,里面有几十个key,我只需要提取json串中body这个key,用pyspark该如何操作呢?


Answer

Answer 1:

用json_tuple提取,格式为json_tuple(json_field, key)

按照你的字段名字,可以写成下面这样

from pyspark.sql.functions import json_tuple, col

data = spark.table('my_table').withColumn('body_text', json_tuple(col('field2'), 'body'))



Question 1022169: pyspark里转成整数型报错TypeError

算法/数据结构/数据库 Spark

pyspark里转成整数型报错TypeError: unexpected type:

df.withColumn('flag', F.col('logintype').isin(['sec', 'fta']).cast(IntegerType))

在df中插入一列,因为是逻辑是否的类型,所以想转成Intergtype整数型,但是程序报错

TypeError: unexpected type:  

这个该怎么处理


Answer

Answer 1:


from pyspark.sql.types import  IntegerType

df.withColumn('flag', F.col('logintype').isin(['sec', 'fta']).cast(IntegerType()))



Question 1655940: hive和spark sql的区别是什么?

算法/数据结构/数据库 Spark Hive

感觉两个都是在hadoop上的数据操作,本质上有区别吗?


Answer

Answer 1:

spark sql也不一定是基于hadoop之上的,只是现在常用的场景是在hdfs之上使用spark。

Spark是在内存中计算,hive sql是提交后进行MapReduce在磁盘中计算。所以Spark会更快。


来自sofasofa(一个专业的机器学习社区),建议去sofa社区阅读,这里只是记录。防止网站在网络中走失。