算法
文章平均质量分 63
jionlp数据分析
JioNLP 开源软件作者,数据分析专家
展开
-
一个快速从中文文本抽取关键短语的工具 ckpe 提取关键短语
一个从 中文自然语言文本 中抽取 关键短语 的工具应用场景 Application scenario1.抽取关键短语在很多关键词提取任务中,使用tfidf、textrank等方法提取得到的仅仅是若干零碎词汇。这样的零碎词汇无法真正的表达文章的原本含义,我们并不想要它。>>> text = '朝鲜确认金正恩出访俄罗斯 将与普京举行会谈...'>>>......原创 2020-01-22 18:34:21 · 7362 阅读 · 2 评论 -
【数据结构】内部排序算法
我总结了一下常见的排序算法。直接写成了类,对于每一种算法的说明都写在了注释里,在调用某个类或者某个排序算法的方法之后,使用python内置的 __doc__方法即可查看具体的某种算法的说明。class SortingAlgorithms(object): ''' 冒泡法:对比模型,原数组上排序,稳定,慢o(n^2) 插入法:对比模型,原数组上排序,稳定,慢,最优的方法是希尔排原创 2017-11-25 21:07:08 · 441 阅读 · 0 评论 -
【数据结构】查找算法 Python 版
我自己写了一个 Python 类,里面放了各种查找算法的代码,并且总结了所有常见的查找算法的基本思想、特点、适用情况等等。通过 __doc__ 方法可以查看代码里的说明和介绍。写代码的时候参考了[Data Structure & Algorithm] 七大查找算法。这个作者用的是C++,但是我看他的代码里面基本没有使用什么C++的特性,也很好懂。我就照着书上的写了个Python的。引用的这个 blo原创 2017-11-26 19:59:39 · 512 阅读 · 0 评论 -
【算法】大数据与空间限制
这篇blog 没有代码,主要是总结了一下处理大数据和有限内存情况下的一般解题思路。很多的代码面试题都给出了数十亿的数据量,或整数,或字符串,再给出1G甚至小到10M的内存空间,让在苛刻条件下完成搜索和遍历,并输出某些结果。这样的问题叫做大数据和空间限制问题。此类问题一般都没有时间限制,因为时间和空间是相互制约和矛盾的,如果想要时间复杂度降低,很多情况下需要占用较大的内存空间,比如归并排序,而如果内存原创 2017-12-22 21:39:21 · 451 阅读 · 0 评论 -
不用额外变量交换两个整数值 Python版
题目如标题所述。分析:采用位运算,这样的代码指令和利用临时变量一样多,但是位运算明显比赋值略微复杂一点点。毕竟赋值不需要经过计算。代码: def exchage_nums(a, b): ''' 不用额外变量交换两个整数值,空间节省了,时间负责度略高一些。 ''' a = a ^ b b = a ^ b原创 2017-12-22 23:01:01 · 910 阅读 · 0 评论 -
统计整数的二进制表达里有多少个1 Python版
题目: 给定一个整数,统计其二进制表示里有多少个1。分析: 方法1:循环迭代该数的二进制的每一位,复杂度是 o(log2 n),n就是该整数 方法2:复杂度仅仅是1的个数。方法是采用位运算抹去0不需要处理。这里的位运算表达式不光在这里见到,其它地方的用处也非常多。再者,计算机组成原理里有详细的对加减乘数四则运算的讲解,如何表示负数、小数等等,不过我都忘了……这些运算与位运算息息相关。单靠位运算原创 2017-12-22 23:07:14 · 3388 阅读 · 0 评论 -
从数组中找出出现奇数次的那个数 Python版
题目: 给定一个数组,数据都是整数,其中只有一个数字出现了奇数次,其它都是偶数次。找出那个奇数次的数字。要求: 时间复杂度o(n),空间复杂度为o(1)。分析: 如果按照常规思路,那么这个题真的比较难操作,至少空间复杂度较高。但是采用位运算,异或即可轻松解决。 整数 n 与 0 的异或结果为 n。整数 n 与 n的异或结果为0,异或运算满足交换律和结合律总体来说,位运算相关的算法题总有点骚操原创 2017-12-22 23:10:51 · 4338 阅读 · 0 评论 -
从整数数组中找出唯二奇数次的数字 Python版
题目: 给定一个数组,数据都是整数,其中只有2个数字出现了奇数次,其它都是偶数次。找出那2个奇数次的数字。要求: 时间复杂度o(n),空间复杂度为o(1)。分析: 如果有两个数字出现了奇数次,比如是 a 和 b,则最终 odd 结果为 a^b,但其中一定有差别。因为数字不一样,所以其异或结果一定不是0,那么也就是其中有一位是1,不论哪一位是1,把数组中所有的那一位是1的数字全部异或,结果就是其原创 2017-12-22 23:16:20 · 901 阅读 · 0 评论 -
构造一个特殊栈,实现方法getmin,返回栈中的最小元素 Python版
题目: 构造一个栈结构,其中需要实现一个方法,该方法 getmin,返回栈中的最小的元素。要求: 时间复杂度为o(1)。分析: 之前我写过了用python写一个栈数据结构,代码在这里: 队列和栈的Python实现在这里,需要以时间复杂度 o(1)完成查找,也就是说,必须以空间换时间。因此,构造一个栈,这个栈的栈顶必须保持始终都是原始栈的最小值。在原始栈插入和弹出元素时,这个辅助栈必须跟着配合原创 2017-12-22 23:22:13 · 1057 阅读 · 0 评论 -
将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
题目:给定一个单向链表,如 LinkedList [21, 5, 120, 19, 72, 50, 312]。 再给定任意一个数值,比如50,返回一个链表,保证左边小、中间相等、右边大的形式,比如该例子的返回链表结果为:[21, 5, 19, 50, 120, 72, 312]再比如给定值100,返回的链表结果为:[21, 5, 19, 72, 50, 120, 312] 且需要保证修改后的原创 2017-12-06 23:06:03 · 1343 阅读 · 2 评论 -
超级素数幂 Python 版
题目:如果一个数字能表示成 p^q,且p是一个素数,q为大于1的正整数,则此数字就是超级素数幂。 param number: 测试该数字是否是超级素数幂 return: 如果不是就返回 False,如果是就返回 p 和 q 值 例如,输入125,返回(5,3)代码:import mathdef get_prime(number): ''' 寻找小于number的所有的质数原创 2017-12-07 09:59:45 · 1048 阅读 · 0 评论 -
【算法】斐波那契数列的计算方法
题目: 计算斐波那契数列。具体什么是斐波那契数列,那就是0,1,1,2,3,5,8,13,21,34,55,89,144,233。要求: 时间复杂度尽可能少分析: 给出了三种方法:方法1:递归的方法,在这里空间复杂度非常大。如果递归层数非常多的话,在python里需要调整解释器默认的递归深度。默认的递归深度是1000。我调整了半天代码也没有调整对,因为递归到1000已经让我的电脑的内存有些撑原创 2018-01-03 19:14:20 · 7655 阅读 · 0 评论 -
【算法】汉诺塔 Python 版
题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材。分析: 算法当然还是递归解了,即把n个汉诺塔盘子分解成 n - 1 个盘子的移动和一个底层盘子的移动,这样一来,问题就成了一连串的递归,然后就可以逐步求解了。 当然了,汉诺塔还有进阶问题,此处先不讨论,随后补上吧。代码:#!usr/bin/python2.7# -*- coding=utf8 -*-# @Time原创 2018-01-03 22:39:48 · 1313 阅读 · 0 评论 -
【数据结构与算法】刷题汇总 Python 版
我的BLOG里写了一部分算法和数据结构,题目都是从网上和书上找的。当然一下这些并不全面,我打算利用今后的时间把各类的算法题都用Python写一遍(因为我主要是用Python),尽可能囊括所有的算法题。写这些题并不是目的,主要还是为了能够提升自己的数据结构和算法的水平,以及码代码的速度和熟练度。所有的代码都提交到了我的 github 上面:冬日新雨的github:数据结构和算法刷题代码下载1、字符串:原创 2017-12-11 17:45:02 · 20151 阅读 · 2 评论 -
【机器学习】线性回归模型分析
具体原理不讲了,线性回归模型,代价损失函数 COST是均方误差,梯度下降方法。属性取值。模型的属性取值设置需要根据每一个参数的取值范围来确定,将所有的属性的取值统一正则化normalization,统一规定在0~1的范围,或者-1~1的范围内,这样在进行线性回归时不会造成额外的回归开销。另外,正则化的方法有很多,常见的方法就是线性正则化,这是在不知道属性对预测值的影响的前提下才这么做的。之原创 2018-01-04 16:31:33 · 979 阅读 · 0 评论 -
环形单链表的约瑟夫问题 Python版
题目: 一个环形单链表,从头结点开始向后,指针每移动一个结点,就计数加1,当数到第m个节点时,就把该结点删除,然后继续从下一个节点开始从1计数,循环往复,直到环形单链表中只剩下了一个结点,返回该结点。这个问题就是著名的约瑟夫问题。代码: 首先给出环形单链表的数据结构:class Node(object): def __init__(self, value, next=0):原创 2017-12-05 11:07:07 · 1928 阅读 · 0 评论 -
【数据结构】串、KMP 算法 Python 版
一、串:串就是字符串,本质上就是线性结构,其中可以存放各种字符,是线性表的一个具体表现形式。二、串表示法:串的表示方法主要有顺序存储,包括预定长度的串(定长顺序表示)和可变长度的串(堆分配存储);还有链表表示方法,包括存储结点大小为1的表示,还有每一个链表结点存储k个字符的链表表示。链表表示法中,如果每一个结点存放一个字符的话,存储密度比较低,但是运算操作效率比较高;反之,每个节点都存储k个字符的原创 2017-12-04 21:54:18 · 2071 阅读 · 1 评论 -
分解调整字符串中的字符 Python 版
题目: 给定一个字符类型的数组 chas[],其中只有数字和 “*”星型字符,现在想把所有的星型字符挪到数组的左边,数字字符全部放到右边,顺序不许变。要求: 时间复杂度为 O(N), 空间复杂度是O(1)。代码: def replace_stars(self, str_list): # 将所有*号移动到数组的左侧 j = len(str_list) - 1原创 2017-11-23 22:59:00 · 1306 阅读 · 0 评论 -
删除链表中的中间节点和 a/b 处的结点 Python 版
题目: 给定一个链表的头结点 head,实现删除链表中的中间节点的函数。 例如:给定链表[1, 5, 12, 33, 45, 171, 999, 1001, 2000],删除结点 45, 给定链表[1, 5, 12, 33, 45, 171, 999, 1001],删除结点 33。 如果链表为空或长度为1,则不删除任何结点。 拓展: 给定一个链表的头结点 head,整数 a 和 b,实现原创 2017-11-28 20:51:41 · 622 阅读 · 0 评论 -
逆序反转单链表 Python 版
题目: 给定一个单向链表的头指针,给出其反向链表。 例如,给定[1, 5, 12, 22, 33, 45],返回[45, 33, 22, 12, 5, 1]代码:class LinkedListAlgorithms(object): def __init__(self): pass def reverse_linked_list(self, head): # 将链表原创 2017-11-28 21:50:39 · 2836 阅读 · 0 评论 -
反转部分单向链表 Python 版
题目: 给定一个单链表的头指针 head, 以及两个整数 a 和 b,在单链表中反转 linked_list[a-b] 的结点,然后返回整个链表的头指针。 例如: 单链表[1000, 5, 12, 100, 45, ‘cecil’, 999], a = 4, b = 6, 返回的链表是[1000, 5, 12, 100, 999, ‘cecil’, 45],也就是说, a 和 b分别为索原创 2017-11-28 23:36:22 · 961 阅读 · 0 评论 -
判断一个链表是否是回文结构 Python 版
题目: 判断一个链表是否是回文结构,如果是返回 True,否则返回 False 比如,给出一个链表为[2, 5, 12, 198, 12, 5, 2],返回 True, 给定链表[2, 5, 12, 198, 12, 54, 20],返回 False。方法1:空间复杂度为 o(n),使用一个栈,将链表中的数据全部push 到栈里,然后再迭代一遍链表,取出栈里的值逐个相互比较,如果不一样则说明不原创 2017-11-29 23:59:29 · 3091 阅读 · 0 评论 -
【数据结构】外部排序总结 + 构建败者树 Python 版
外部排序又称大数据文件排序。我看了教材之后,依然对外部排序有些模棱两可的误解,搜了一些资料才发现问题出在哪里。一、多路平衡归并排序:外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对 900 MB 的数据进行排序,但机器上只有 100 M原创 2017-12-08 22:55:45 · 2224 阅读 · 0 评论 -
求两数的最大公约数 Python 版
题目:给定两个自然数,求这两个数的最大公约数。分析:单看题目的话,非常简单,我们可以循环遍历自然数,如果能够整除两个自然数,就把这个数记下来,在这些记录中找到最大的一个。 但是这样做有几个缺点:一是做除法计算量比较大,二是遍历所有自然数完全没有必要。另外,如果能够循环,还是不要递归,因为Python的函数递归最大栈空间是1000(如果我没有记错的话),如果数字大一些,很容易出现爆栈。所以在这原创 2017-12-09 21:20:54 · 3371 阅读 · 0 评论 -
八皇后问题 Python 版
题目:给定一个 N*N 正方形棋盘,在上面放置 N个棋子,又叫皇后,使每两个棋子都不在同一条横线上、竖线上、斜线上。一般我们都讨论8皇后,但是只要N > 4,都会存在解的。分析:方法1:根据定义来处理,即每往棋盘中放置皇后的时候,都要判断哪些位置可以放新加入的皇后,而哪些地方如果放置皇后的话,会造成冲突。我下面写的这个代码就是基于此。 方法2、我看了下别人的优化,主要是采用位运算来实现计算复杂原创 2017-12-09 21:29:11 · 1623 阅读 · 0 评论 -
求数组中两个字符串的最小距离 Python 版
题目:给定一个数组 strs,其中的数据都是字符串,给定两个字符串 str1,str2。如果这两个字符串都在 strs数组中,就返回它们之间的最小距离;如果其中任何一个不在里面,则返回 -1;如果两个字符串相等,则返回 0。例如:给定[‘*’,’3’,’*’,’5’,’10’,’9’,’7’,’1’,’*’],再给定两个字符串’* ‘和’9’,通过函数求得返回值 3。分析:有两种方法, 方法1原创 2017-12-11 13:04:10 · 7642 阅读 · 2 评论 -
括号字符串的相关问题 Python 版
题目:1、给定一个字符串,判断这个字符串是不是有效的括号字符串,也就是满足数学算式可算性。比如,str=”(()(())())”,返回 True,给定str = “(()((())(())”,返回False。如果括号字符串中掺杂了其它的字符,则返回False 2、给定一个括号字符串,找出其中最大的子串长度,比如:给定str = “(()((())(())”,返回 8。分析:对于问题一:有两种方原创 2017-12-11 17:25:17 · 1709 阅读 · 2 评论 -
打印两个有序链表的公共部分 Python 版
题目: 给定两个有序链表的头指针head1 和head2,打印两个链表的公共部分代码: 这个函数中我使用了我自己写的单链表类,这个代码在另外一篇blog里。 Python版本的单链表类 该问题的函数如下:class LinkedListAlgorithms(object): def __init__(self): pass def print_common_pa原创 2017-11-23 21:27:13 · 844 阅读 · 0 评论 -
在单链表中删除倒数第K个节点 Python 版
题目: 给定一个链表,删除其中倒数第k个结点。代码:class LinkedListAlgorithms(object): def __init__(self): pass def rm_last_kth_node(self, k, linked_list): # 删除倒数第 K 个节点,针对单链表的 if linked_list.is_empty(原创 2017-11-23 21:32:06 · 1222 阅读 · 0 评论 -
获取字符串的统计字符串 Python 版
题目: 给定一个字符串 str,返回 str 的统计字符串。 例如:“fffjkk99999022____”,其统计字符串是“f_3_j_1_k_2_9_5_0_1_2_2___4”代码: def get_count_str(string): # 获取字符串的统计字符串 if string == "": return "" coun原创 2017-11-23 21:48:54 · 1799 阅读 · 1 评论 -
判断字符数组中是否所有的字符都只出现过一次 Python 版
题目: 给定一个数组,判断其中所有的字符是不是都只出现过一次。要求1: 时间复杂度为 O(N)。代码1: def is_unique_1(self, str_list): # 判断字符类型数组中的字符是否均只出现过一次,时间复杂度o(n) if str_list == "": return False i, map = 0, [0]原创 2017-11-23 22:03:19 · 1317 阅读 · 0 评论 -
在有序但含有None的数组中查找字符串 Python 版
题目: 给定一个字符串数组 str[],其中有一些位置是 None,但在不是 None 的位置上,其字符串是按照字典的顺序由小到大依次出现的。再给定一个字符串 str,返回 str在 strs中出现最左的位置。 例如: strs = [‘a’, None, ‘b’, None, ‘d’, ‘d’, None, ‘k’,’m’] str = ‘d’ 返回 4。 如果没有找到该字符,即不存在原创 2017-11-23 22:29:44 · 1118 阅读 · 1 评论 -
将字符串中的空字符全部替换为别的字符串 Python 版
题目: 给定一个字符类型的数组 chas[], 其右半边全部是空字符,左半边没有空字符;现在需要将左半边所有的空格space替换为 “%20”,现在的假设是右半边足够大,不需要考虑这个空间。 例如:chas = [’ ‘,’a’,’ ‘,’b’,’ ‘,’ ‘,’g’] 输出的结果是 [‘%’, ‘2’, ‘0’, ‘a’, ‘%’, ‘2’, ‘0’, ‘b’, ‘%’, ‘2’, ‘0’,原创 2017-11-23 22:42:22 · 5297 阅读 · 0 评论 -
将整数字符串转成整数值 Python版
题目 给定一个字符串,如果其中所有的字符都是数字,且符合人们日常的书写规范,则返回该整数值,否则返回0。 例如:“123”,返回123; “038123”,返回0; “dfa423”,返回0; “-482”,返回-482; “-03”,返回0。代码 def str_2_int(string): # 将符合规范的数字字符串转为数字 if string == "":原创 2017-11-09 21:47:49 · 2164 阅读 · 1 评论