- 博客(29)
- 收藏
- 关注
原创 数据结构与算法07 二叉树
基本概念二叉树遍历:前序遍历:父节点 —> 左子树 —> 右子树中序遍历:左子树—> 父结点 —> 右子树后序遍历:左子树 —> 右子树 —> 父结点父节点的位置是区分的关键二叉树的查找也分为:前中后序查找。JAVA代码实现了二叉树的三种遍历方式,三种查找方式以及节点的删除方法。public class BinaryTreeTest { ...
2020-02-22 14:10:50
302
1
原创 数据结构与算法06 插值查找
原理介绍插值查找是基于上一篇博客介绍的二分法查找的改进,将查找点的选择改进为自适应选择,可以提高查找效率。主要是mid的选取不同。二分查找中 mid的确定:mid=(left+right)/2=left + 1/2 * (right-left)插值查找中 mid的确定:mid=left+(target-a[left]) /(arr[right]-arr[left])* (right-lef...
2020-02-19 03:43:25
206
原创 数据结构与算法06 二分查找
二分法查找的思路如下:首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复第一步操作。如果某一步数组为空,则表示不存在目标数。注:二分法查找只对有序数列有效。JAVA代码实现代码可以解决当要查找的数在数组中可能存在多个的问题。当所查找的数不存在,则返回空列表。...
2020-02-18 19:28:40
212
原创 数据结构与算法05 基数排序
基本概念基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。步骤如下图:缺点:基数排序不可以处理负数,当然可以通过统一加上一个整数排列后,再减去...
2020-02-12 19:11:46
192
原创 数据结构与算法05 归并排序
基本概念归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序的流程如图所示,分的过程是将待排序列一直进行二分,直至被分为只包含一个元素的子序列,然后将子序列合并并排序,最终得到完整的有序序列。JAVA代码实现public class M...
2020-02-12 14:25:55
93
原创 数据结构与算法05 快速排序
基本概念快速排序是一种运用了分治思想的排序,是一种内排序(数据存储在内存中的排序)。在很多编程语言中,对数组,列表进行的非稳定排序在内部实现中都使用的是快速排序,快排拥有很高的使用率,得益于它的时间复杂度。思路如下:从数列中选取一个数作为中轴数(pivot),中轴数可任意选取。将数列中比中轴数大的数放在中轴数的右边,比中轴数小的数放在其左边。再对左右区间重复步骤二,直至各区间只存在一个数...
2020-02-10 23:34:56
112
原创 数据结构与算法05 希尔排序
基本原理希尔排序又称为“缩小增量排序”,它属于插入类排序方法,是对直接插入排序的改进。基本思想:将待排序的元素分为多个子序列,使得每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序。具体操作:首先取一个整数gap(小于n)作为间隔将整个序列分为gap个子序列,所有距离为gap的元素放在同一个子序列中,在每一个子序列...
2020-02-10 00:01:13
182
原创 数据结构与算法05 插入排序
基本概念插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它与有序表元素进行比较,将它插入到有序表中的适当位置,生成新的有序表。JAVA代码实现public class InsertSort { public stat...
2020-02-09 20:50:35
113
原创 数据结构与算法05 选择排序
基本概念选择排序工作原理是,每一次从待排序的数据元素中找出最小(或最大)的一个元素,顺序放入已排好序的数列,直到全部待排序的数据元素排完。当数据序列长度为n时,须进行n-1次循环。具体步骤:首先从原始数组中选择最小的数及其位置,将其和位于第1个位置的数据交换。接着从剩下的n-1个数据中找出最小数及其位置,将其和第2个位置的数据交换不断重复,直到第n-1次结束。JAVA代码实现pu...
2020-02-09 14:14:13
155
原创 数据结构与算法05 冒泡排序
冒泡排序是属于交换排序的一种简单的排序方法。它的基本思想是对所有相邻数据进行比效,如果是逆序则将其交换,最终达到有序化。基本冒泡排序序列长度为n的数组,进行n-1趟交换,每趟交换会把序列中最大的数移动至最右侧。代码实现:public class BubbleSort { public static void main(String[] args) { int[] ...
2020-02-09 13:28:39
98
原创 数据结构与算法04 八皇后问题(递归)
八皇后问题:该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。JAVA代码实现使用维度为8的一维数组即可解决八皇后问题。其中数组的下标对应棋盘中皇后所在的行数,数组下标对应的值对应棋盘中皇后所在该行的列数。检测是否放置在同一斜线:Math.abs(n...
2020-02-07 22:26:17
125
原创 数据结构与算法04 路径回溯(递归)
路径回溯(递归应用)创建二维数组map 表示地图。i,j 表示从地图的哪个位置开始出发 (1,1)。如果小球能到 map[6][5] 位置,则说明通路找到。约定: 当 map[i][j] 为 0 表示该点没有走过 当为 1 表示墙; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通。在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通...
2020-02-07 14:02:56
438
原创 数据结构与算法04 后缀表达式
基础概念后缀表达式是指:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。如:(3+4)*5-6 ==> 3 4 + 5 * 6 -栈可以解决此问题,从左到右一个个遍历后缀表达式,遇到数就入栈,遇到操作符就依次取出栈顶的两个操作数进行计算,并把计算结果入栈,供后面计算,直到栈为空,说明表达式计算完毕。J...
2020-02-06 13:15:42
395
原创 数据结构与算法04 中缀表达式
思路解析通过两个栈:数栈与符号栈解决中缀表达式的问题。具体思路如下(来源于韩顺平老师课件):JAVA代码实战基于上一篇博客通过数组模拟栈,增加更多的方法有助于我们解决中缀表达式的问题。具体栈的类构造如下:class ArrayStack{ private int maxSize; //栈的大小 private int[] stack; private int to...
2020-02-06 00:53:55
254
原创 数据结构与算法04 数组模拟栈
基础概念栈是一种有序列表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为栈底。数据元素遵守后进先出的原则。定义一个top表示栈顶,初始化为-1。栈满:top = maxSize - 1。其中maxSize为栈的最大容量。入栈:当有数据data入栈,stack[++top] = data出栈:出栈操作:value = stack[top--]...
2020-02-05 22:52:07
99
原创 数据结构与算法03 约瑟夫问题
约瑟夫问题:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。环形...
2020-02-04 11:45:55
578
1
原创 数据结构与算法03 双向链表
基本概念在单链表的基础上,双向链表在单链表的节点中增加一个指向其前驱的pre指针。双向链表的基本结构如图所示:双向链表的方法遍历:与单链表相同,只是可以向前,也可以向后。添加:添加到双向链表的末尾。首先找到链表的尾节点rear,将node进行添加,进行如下操作:(1)rear.next = node(2)node.pre = rear修改:与单链表相同。删除:因为是双向链表,可...
2020-02-03 23:13:26
100
原创 数据结构与算法03 单链表
单链表基本概念链表的每个结点由数据域和指针域(指向后继结点的指针)构成。如图:单链表可分为带头结点和不带头结点的单链表。带头结点的单链表,头指针head指向头结点,头结点的值域不包含任何信息,从头结点之后的结点开始存储信息。头指针:永远指向链表中第一个结点的位置(如果链表有头结点,头指针指向头结点;否则,头指针指向开始结点)。单链表示意图如下所示。单链表的最后一个节点的指...
2020-02-03 14:43:06
352
原创 数据结构与算法02 队列2
之前只是用数组对队列进行简单模拟,存在很多问题。这篇博客使用数组模拟循环队列。front指针指向队头元素,rear指针指向队尾元素的下一个位置。队列满时,依旧保留一个空闲单元。如下图所示。队列为空的判断条件:rear == front。由于是循环队列,rear可能比front大也可能比其小。所以队列最大尺寸是maxSize时,队列满的判断条件是:(rear + 1) % maxSize...
2019-11-18 12:22:15
253
原创 数据结构与算法02 队列1
队列是一个有序列表,可以用数组或者是链表来实现。遵守先入先出原则。示意图如下:使用数组模拟队列maxSize是队列的最大容量。front与rear分别标记队列的前后两端。front(头指针)随着数据输出改变,rear(尾指针)随着数据输入改变。判断队列为空的条件:front == rear判断队列满的条件: rear = maxSize - 1class ArrayQueu...
2019-11-18 11:29:06
84
原创 数据结构与算法01 稀疏数组
二维数组转稀疏数组:遍历原始数组,得到非零有效数据个数sum。创建对应稀疏数组,行为sum+1,列为3。(稀疏数组第一行存储原始数组信息)将二维数组有效数据存入稀疏数组。稀疏数组恢复为原始数组:根据稀疏数组第一行的数据,创建原始二维数组。读取第一行后的数据,都原始二维数组对应位置赋值。代码(JAVA)package sparsearray;public class S...
2019-11-15 12:02:53
186
原创 Neural Collaborative Filtering(NCF) 代码实战(Keras)
博客主要分为两部分。第一部分为论文简介,第二部分为代码实战。论文简介:1. 通用框架下图是作者提出的用神经网络解决推荐系统问题的通用框架。论文先将用户与物品分别进行one-hot编码,然后通过一个Embedding层映射得到对应的向量,这就类似于矩阵分解(MF)中用户与物品的潜在相量。通过此操作可以使网络自己训练调整参数,还可以降低以及控制输入神经网络的维度。2. GMFGMF被称为...
2019-08-20 23:36:08
3487
1
原创 Autoencoders Meet Collaborative Filtering 代码实战
原Github代码地址:https://github.com/bestcurry/Autorecimport numpy as npdef read_rating(path, num_users, num_items, num_total_ratings, a, b, train_ratio): # train_ratio :训练集所占的比例 # num_total_rat...
2019-08-16 17:47:23
436
原创 python处理Movielens数据集(1M)
导入需要的包import numpy as npimport pandas as pd设置常数及参数。用户数、物品数与评分总数可以查看文件或使用python读取数据获得。n_users = 6040 # 用户的总数n_items = 3952 # 物品的总数n_all_ratings = 1000209 # 总的评价数train_ratio = 0.9 # 训练集所占比例 初始...
2019-07-22 23:23:38
2110
2
原创 sklearn 数据预处理
一、缺失值处理主要有以下几种方法处理缺失值问题:(1) 如果缺失值在数据集中所占比例非常小,可以删除存在缺失值的行。(2) 对缺失值进行众数或平均值填充。(3) 使用机器学习算法对缺失值进行预测,如RandomForest(随机森林)。(4) 对于标称属性,可以赋一个代表缺失的值。因为缺失本身可能也带有一定的隐含信息。...
2019-04-18 12:35:53
293
翻译 推荐算法 Surprise(三)
预测算法的使用Surprise提供很多内置算法。所有算法都来源于AlgoBase这个基础类,这其中包括一些关键方法(例如predict,fit和test)可供使用的预测算法的种类与细节可以在prediction_algorithms文档中查阅。每个算法都是Surprise全局命名空间的一部分,因此您只需要从Surprise包中导入它们的名称,例如:from surprise import K...
2019-03-14 13:33:56
1047
翻译 推荐算法 Surprise(二)
使用自定义数据集:Surprise有一些内置数据集,但您当然可以使用自定义数据集。评分数据可以从文件(如csv文件)或pandas 的Dataframe 来加载。无论哪种方法,都需要定义一个Reader对象来解析文件或Dataframe。1. 从一个文件中上传数据集(例如csv文件),你需要 load_from_file()函数。from surprise import BaselineOn...
2019-03-12 20:42:43
1136
翻译 推荐算法 Surprise(一)
自动交叉验证:Surprise有很多内置算法和数据集供你使用。最简单的,我们可以只用几行代码运行交叉验证程序。from surprise import SVDfrom surprise import Datasetfrom surprise.model_selection import cross_validatedate = Dataset.load_builtin('ml-100k...
2019-03-12 13:24:19
2134
6
原创 使用python处理Movielens数据集
注意点:由于电影id最大编号过大,为节省内存空间,使用movies中movieId相对应的index构建rating遍历函数 iterrows()的使用:for index, row in dataframe.iterrows():import numpy as npimport pandas as pdratings_df = pd.read_csv('ratings.csv'...
2019-03-04 11:55:11
2784
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人