2024-09
10

发现规律,抽象步骤

By xrspook @ 8:53:01 归类于: 烂日记

星期天的下午,初中的同学群又开始了数学题答问答。这一次又不知道是什么题目,反正照出来的那个相片右下角页码那里写的是有理数。有理数无理数具体是什么东西,实际上我已经不太记得了,但这就只是一个定义,稍微翻看一下书本,就会回忆起来。我不知道有理数跟那道题有什么关系。对一个路人来说,我觉得那道题就是一个考察发现规律的,发现那堆数字正负值的规律、发现那堆数字排列组合的规律。相对于高中时代的题目来说,我感觉那道可能是小学或者初中的题目,规律还是比较好找的。

当我第一眼看到那道题目的时候,我就彻底没想过要理,直接继续看我的电视,把那忽略掉,因为我知道即便我不回答,其他人也会回答。我不是唯一的一个答案。看上去那是一本习题册或者一个试卷册,无论是哪一款,肯定有标准答案,问题只是我的那个同学不知道那个答案到底是怎么来的。其实我也不知道他为什么要知道那个答案是怎么来的,毕竟要做这个题目的人不是他,而是他的孩子。所以孩子不知道怎么做那道题,为什么操心了半天的人却是家长呢?当我那个同学还是个孩子的时候,他不会做的题目他的家长绝对不会为他操心。不会做就不做,不会做就回去问老师问同学。现在这个该怎么做的这个责任仿佛都落到了家长的身上,又或许,是因为我的同学觉得他还是个小孩的时候,他的父母没尽过这种义务,他觉得不好,所以现在他成了孩子的家长,他觉得自己有责任去弄清楚,然后教小孩。

他觉得这是他的义务,但我就只是个同学而已,我没有义务解答题目。有兴趣的时候可能看一眼,没兴趣的时候就像这样直接忽略。周日下午吃过晚饭,回单位的路上,我又打开了那个群,仔细看了一下题目以及同学的回答。看过那道题目以后,我就得出了最上面的那个看法。我不知道那道题跟有理数到底有什么关系,但可以肯定的是,那道题的意图就是让做题的人发现规律并利用规律。

发现规律利用规律这种东西,在往后的人生之中实在太普遍了。抽象到哲学的层面,几乎每一件事都是这么个情况。数学这种东西,理论上是最容易用逻辑解决的,尤其是对大学以下的数学而言。以前没发现,后来我才意识到,以前那些有标准答案的题目逻辑性都非常强。只是当年的我要应付的事情太多,没办法逐个击破,没有领会其中的逻辑,于是也就只能死记硬背了。

那道题给我的感觉就是,对懂的人来说,找出规律以后,代入数字就能出结果,但是对那些知道规律,但又不知道如何把规律抽象成公式的人来说,那就等于是只能把那些东西都罗列出来,但关键是如果数量级很大,全部罗列是不可能的任务。对懂行的人来说,无论是自己列公式,还是写个程序跑一下,前提都是你发现了其中的规律,而且你把那个规律抽象成某些公式,于是最后题目就变成代入数字求和。如果硬是把所有东西都罗列一遍,那就只是写个程序,让程序按照你要的那个样子跑一遍,但这个跑一遍对懂的人来说是毫无意义的。因为不需要跑,不需要用最后的结果数字验证就能得出预判的那个结果就是最终答案。

编程是什么呢?编程就是发现规律,然后把那些规律抽象成某些步骤。

2020-04
18

死磕二分法搜索

By xrspook @ 15:00:07 归类于: 扮IT

我是看着题目的中文版做题的

练习10:要检查一个单词是不是在上面这个词汇列表里,你可以使用 in 运算符,但可能会很慢,因为这个 in 运算符要从头到尾来搜索整个词汇表。我们知道这些单词是按照字母表顺序组织的,所以我们可以加速一下,用一种对折搜索(也叫做二元搜索),这个过程就和你在现实中用字典来查单词差不多。你在中间部分开始,看看这个要搜索的词汇是不是在中间位置的前面。如果在前面,就又对前半部分取中间,继续这样来找。当然了,不在前半部分,就去后半部分找了,思路是这样的。不论怎样,每次都会把搜索范围缩减到一半。如果词表包含了113809个单词,最多就是17步就能找到单词,或者能确定单词不在词汇表中。那么问题来了,写一个函数,名为 in_bisect,接收一个整理过的按照字母顺序排列的列表,以及一个目标值,在列表中查找这个值,找到了就返回索引位置,找不到就返回空。

做到死去活来词语在词汇表里有索引正确,没有时却会疯掉的时候我不得不去看答案,看到答案后傻眼了,答案对单词的判断只有True和False,再去找原题,我那个去,题目改了!不要求索引了好吗!

Exercise 10: To check whether a word is in the word list, you could use the in operator, but it would be slow because it searches through the words in order. Because the words are in alphabetical order, we can speed things up with a bisection search (also known as binary search), which is similar to what you do when you look a word up in the dictionary (the book, not the data structure). You start in the middle and check to see whether the word you are looking for comes before the word in the middle of the list. If so, you search the first half of the list the same way. Otherwise you search the second half. Either way, you cut the remaining search space in half. If the word list has 113,809 words, it will take about 17 steps to find the word or conclude that it’s not there. Write a function called in_bisect that takes a sorted list and a target value and returns True if the word is in the list and False if it’s not. Or you could read the documentation of the bisect module and use that! Solution: http://thinkpython2.com/code/inlist.py.

又纠结一番后我终于写出了一句“first > last”返回例外情况,终于,世界被拯救了!记录索引和不记录索引很不一样啊,按照参考答案的解法,i即便返回也永远是1,索引无能。纠结是有好处的,让我明白到二分法搜索有多么的高效,简直甩while循环几十条街,但如果真索引的话,估计我会很懒地直接用list.index(),虽然用之前必须用in历遍列表,判断是否存在。

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
import time
def in_bisect(library, first, last, myword): # 二分法搜索,10万数据查询最多只需不到20步
    if first > last: # 这是一句拯救了我的条件
        return None
    else:
        mid = (first + last)//2
        if myword == library[mid]:
            return mid
        elif library[mid] > myword:
            return in_bisect(library, first, mid-1, myword)
        else:
            return in_bisect(library, mid+1, last, myword)
myword = 'zoo' # input('myword is: ')
i = 0
library = []
fin = open('words.txt')
for line in fin:
    word = line.strip()
    library.append(word)
library.sort()
start = time.time()
 
# j = 0
# while i < len(library) - 1: # 我的脑洞第一反应用的循环
#     if myword == library[i]:
#         j = i
#         break
#     i += 1
# if j == 0:
#     print('myword is not in library')
# else:
#     print('index =', j)
 
# if myword in library: # 伟大列表自带的查询索引号,但先得确定单词在那里
#     i = library.index(myword, 0, len(library)-1)
# if i == 0:
#     print('myword is not in library')
# else:
#     print('index =', i)
 
if in_bisect(library, 0, len(library), myword) == None: 
    print('myword is not in library')
else:
    print('index =', in_bisect(library, 0, len(library), myword))
end = time.time()
print(end-start)
# myword is not in library while 0.07   index 0.003  bisect 0.001
# apple 4450               while 0.003  index 0.001  bisect 0.001
# zoo 113707               while 0.07   index 0.005  bisect 0.001
# while,index和bisect没有对比就没有伤害
2014-08
1

写写写

By xrspook @ 14:23:57 归类于: 烂日记

写一篇东西到底有多难?对我来说这很简单,因为这东西天天都要做,但对某些人来说这太难了,因为他们喜欢把想法都说出来而不是写下来,因为怕自己写不好所以不去写,长期不去写当然就不知道如何去下笔和怎么写才是个模样了。当我还是个小屁孩,被老师家长逼着我写的时候我也写不好,也不想写,但我真的不能写不会写不偶尔想写些什么吗?其实又未必,比如说初中的时候我写过一篇《减负不减难,学生怎么办》,这篇东西的题目是爸爸想的,我正文写出来先是拿去给当时的语文老师修改,老师没主要修改些什么,叫我想一个好一点的题目,然后我就把这个任务交给了爸爸。把那东西抄正以后我投递到《广州日报》了,后来当然是一点音信都没有,不过这并不影响我的心情,因为那东西我想写,我有冲动去写,不写不舒服,所以就喷出来了。至于其它人怎么看,与我无关。当时太简陋,我甚至没有留下原稿,所以具体内容是什么多年以后我就只能最清楚地记住了那个题目而已了。可恶的是我从来不参加什么征文比赛一次都没有,看到就讨厌,但其实呢,主动是有过一次的,在大学期间我拿了一篇用英文写的《等待野蛮人》读后感去投稿,被邮件回复说如果我是中国人请用中文,卧槽!难道中国人就不能用英文投稿!你们又没限定语言必须是中文!!!工作之后每年总公司都会举行征文比赛,我半次都没参加,因为我蔑视。但我不参加真的不代表我不会写,每每我写出的东西被领导看后都会惊讶愕然一番。在你们这些人面前展示才华?我为什么要这么做呢!我宁愿被忽视埋没。

2014-07-07开始写,今天(2014-08-01)终于写完了《当我谈跑步时,我谈写什么》的观后感,不是说我真的用了一个月的时间去磨才磨出来了,实际上是我上个月头开始那天写了个把小时,昨天晚上又写了十五分钟,今天早上再用了不到一个小时修改整理,反正加起来就是没用上3个小时。搞完以后我兴奋地发了一个长围脖。读后感这东西,喜欢抄的尽管拿去,反正如果到我演讲那天有人说我东西雷同的话,那纯粹是污蔑扯淡,我根本不屑于用Ctrl+C和Ctrl+V拼凑东西出来。4000多字对我来说是很轻松的事,不过要让4000多字都自始至终围绕一个主题丝丝入扣段与段之间又要首尾相的话这貌似就有点难度了,因为我习惯跳跃。不相接也没事,因为根本不会有人会认真看完全文,都是跳读的,你跳我也跳,仅此而已。

还有不到2个小时就到周五的下班回家时间,我说过要在这周工作日之内完成读后感全部和PPT主体的,PPT我一点都还没开始呢!虽然思路已经有了!!!!!所以,现在我要加把劲了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,全力开火~~~~~~~不过说来也烦恼,本来PPT今天早上就应该开始,但突如其来被告知要先把检验高级工培训的相关这个那个搞了所以耽误了我个把小时。这个单位的人就是这么脱离带水,要不你让我全程自己搞,要不你就负责好全部一切我不用烦,搞着搞着又不搞这是啥意思?!没有一点效率,执行力低下!

开工!!!

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress