0%

研一上算法分析讨论课部分习题

题三:素数判定问题

题四:不无聊序列

题五:二维平面的最近点对问题

题六:顺序统计量问题:第i小元素

第一章 KNN算法

1.1 问题定义:

给定m个已被分为Cn类个样本[监督算法],对未标记类别的测试数据data求其所属类别?

1.2 算法描述:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

Read more »

第1章 Series()

1.1Series的创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd
##numpy
a=np.arange(16)
se=pd.Series(a,index=pd.date_range('20191012',periods=16))
print(se)
print(se['20191024'])
## python dict
dic={'name':'chendong','age':22,'gender':'男'}
se1=pd.Series(dic)
print(se1)
## python list
lis=['hello','world',1,2,3]
se2=pd.Series(lis)
print(se2)
# 标量值
se3=pd.Series(3,name='hw')
print(se3)
Read more »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import tushare as ts
import pandas as pd
import numpy as np
sock=ts.get_hist_data('600036',start='2018-06-01',end='2018-12-31')
sock1=pd.DataFrame(sock,columns=['open','high','close','low','volume'])
sock1=sock1.sort_values('date')
print(sock1)
print('输出这半年内成交量最低和最高那两天的日期和分别的成交量:')
print(sock1.loc[sock1['volume']==sock1['volume'].max()].loc[:,'volume'])
print(sock1.loc[sock1['volume']==sock1['volume'].min()].loc[:,'volume'])

print('列出成交量在 1000000 以上的记录:')
print(sock1.loc[sock1['volume']>1000000])

print('计算这半年中收盘价(close)高于开盘价(open)的天数:')
print(sock1.loc[sock1['close']>sock1['open']])
print('天数:',sock1.loc[sock1['close']>sock1['open']]['open'].count())

print('''计算前后两天开盘价的涨跌情况,用两种方式表示.
第一种输出每两天之间的差值(后一天减去前一天),
第二种输出一个开盘价涨跌列表,涨用 1 表示,跌用-1 表示。''')
openind=sock1['open'].to_numpy()
opendf1=pd.DataFrame(np.diff(openind))
opendf2=pd.DataFrame(np.sign(np.diff(openind)))
print(opendf1)
print(opendf2)

print(' 计算每月收盘价的平均值: ')
print(sock1.index)
months=[]
print(sock1.index[0])
for i in range(len(sock1.index)):
months.append(sock1.index[i].split('-')[1])
print(len(months))
print(months)
print('----------------------------')
sock1.index=months
# print(sock1)
print(sock1.groupby(sock1.index)['close'].mean())
#
#<参考答案>
print('==============================================================================')
# import tushare as ts
# import numpy as np
# 1
df = ts.get_hist_data('600036', start = '2018-06-01', end = '2018-12-31')
df = df.iloc[:, :5] # 获取前 5 列
df.sort_index(inplace = True) # 按 date 列进行排序
print(df)
# 2
min_day = df.sort_values('volume').iloc[0,]
min_volume = min_day.volume
min_volume_date = min_day.name
print("the min volume of {} is at {}".format(min_volume, min_volume_date))
max_day = df.sort_values('volume').iloc[-1,]
max_volume = max_day.volume
max_volume_date = max_day.name
print("the max volume of {} is at {}".format(max_volume, max_volume_date))
# 3
print(df[df.volume >= 1000000])
# 4
print(len(df[df.close > df.open]))
# 5
print(df.open.diff())
print(np.sign(np.diff(df.open)))
# 6
month = [item[5:7] for item in df.index]
print(df.close.groupby(month).apply(np.mean))

题一:用字典创建一个平台的用户信息(包含用户名和密码)管理系统,新用户可以用与现有系统帐号不冲突的用户名创建帐号,已存在的老用户则可以用用户名和密码登陆重返系统。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
userdict = {'chendong': '1234', 'chenjuan': '5678'}


def newusers():
name = input('enter your name: ')
if name in userdict.keys():
newusers()
else:
psw = input('enter your password: ')
userdict[name] = psw


def oldusers():
uinfo = input('enter your name and password: ')
print(uinfo)
user=uinfo.split(',')
name,password=user
print(name,password)
if password in userdict.values():
print(name, 'welcome back ')
else:
print('login incorrect')


def login():
option = input('enter a option(N or O or E): ')
if option == 'N':
newusers()
if option == 'O':
oldusers()
if option == 'E':
exit()


if __name__ == '__main__':
login()
print(userdict)

Read more »

题目:给定一个序列,寻找序列中出现最多的数字,我们称这样的数字为该序列的“众数” 如[2,3,1,1,1]序列的众数为1

法一:一般方法 时间 O(nlog(n)) 空间为不重复的数字数,建立一个二叉排序树,做统计。

法二:时空 O(n)方法:只适合在确定数字的范围时,且范围较小,可以开同样大的数组,遍历一边,一边遍历一边做统计

Read more »