三元组

稀疏矩阵的三元组表与十字链表存储

假装没事ソ 提交于 2020-01-24 04:42:46
三元组表:存储稀疏矩阵的非零元素,以及该元素所在的行、列信息,极大的节省了空间(如相比于一般的二维数组的存储),而且三元组表的某些算法的时间效率也要优于经典算法,如基于三元组表的一次快速转置算法等等 十字链表:当要进行矩阵的加、减、乘等运算时,有时非零元素的位置会发生很大的变化,三元组表位保持以行或列序为主而大量移动元素,十字链表就比较灵活,它在三元组表的基础之上(元素e、行row、列col),多了两个指针域down和right(名称随意),right指向同一行中的下一个非零元素,down指向同一列的下一个非零元素 来源: CSDN 作者: 网络一线牵 珍惜这份缘 链接: https://blog.csdn.net/weixin_43838785/article/details/103827657

LeedCode_三数之和

丶灬走出姿态 提交于 2020-01-24 01:31:53
LeedCode_三数之和 题目说明 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 链接: https://leetcode-cn.com/problems/3sum 分析:问题转化为两个数之和为变值,先排序,采用滑动窗口的方式进行快速求解两个数,避免重复元祖的方式:1.排序 2重复跳过 3到i后面去找 vector < vector < int >> threeSum ( vector < int > & nums ) { vector < vector < int >> res ; int n = nums . size ( ) ; sort ( nums . begin ( ) , nums . end ( ) ) ; if ( n < 3 || nums [ 0 ] > 0 || nums [ n - 1 ] < 0 ) { return res ; } for ( int i = 0 ; i < n ; i ++ ) { if ( nums [ i ] > 0 )

LeetCode 三数之和 Golang

落花浮王杯 提交于 2020-01-22 02:31:43
题目地址 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4] , 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 代码实现 package main import ( "fmt" "sort" ) func main() { nums := []int{-1,0,1,-1,2,2,2,2,-1,0,0,0,-1,-4} result := threeSum(nums) fmt.Println(result) } func findNext(nums []int, i int) int { j := i + 1 for ; j < len(nums); j++ { if nums[i] != nums[j] { return j } } return j } func findPre(nums []int, i int) int { j := i - 1 for ; j >= 0; j-- { if nums[i] != nums[j] { return j } } return -1 } func threeSum(nums

数据结构(java语言描述)串与数组——稀疏矩阵的三元组表存储

拟墨画扇 提交于 2020-01-20 01:22:35
知识点补充: 稀疏矩阵:是具有较多零元素且非零元素的分布无规律的矩阵。(一般矩阵是用多(二)维数组存储)。 但是,稀疏矩阵的存储比较浪费存储空间,因此为了节省存储空间可以用一个三元组表来存储稀疏矩阵。 三元组表:三元组表中的任意一个三元组元素存储了稀疏矩阵中的非零元素、所在行和所在列。 稀疏矩阵转三元表表示的原理图如下(ps手写版,比较快,将就看吧,主要是能明白^~^): java语言表示的三元组(结点)的类形式: package chuanshu; class tripleNode { //三元组的定义 private int row; //元素所在稀疏矩阵中的行号 private int col; //元素所在稀疏矩阵中的列号 private int value; //元素所在稀疏矩阵中的非零元素值 public int getcol(){ return col; } public int getrow(){ return row; } public void setcol(int col){ this.col=col; } public void setrow(int row){ this.row=row; } public int getvalue(){ return value; } public void setvalue(int value){ this.value

力扣之数组1—三数之和

十年热恋 提交于 2020-01-17 07:10:36
三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 解题思路: 排序 + 双指针 算法流程: 判断数组长度是否为空或小于3,是的话直接返回空 对数组进行排序,可放置出现重复的结果 遍历排序后数组: * 若nums[i]>0,直接返回结果,因为已经排序好了后边三数相加不可能等于0 对于重复元素跳过 应左指针a = i+1,右指针b = n-1,当a<b时执行循环: 当 nums[i]+nums[a]+nums[b==0,执行循环,判断左边和右边是否和下一位置重复,去除重复解。并同时将a,b移到下一位置,寻找新的解, 若和大于0,说明 nums[b] 太大,b左移; 若和小于0,说明 nums[a] 太小,a右移 代码: class Solution : def threeSum ( self , nums : List [ int ] ) - > List [ List [ int ] ] : n = len ( nums ) result = [ ] if ( not

知识图谱学习笔记(九)——知识图谱的存储与检索

ⅰ亾dé卋堺 提交于 2020-01-11 05:20:02
知识图谱的存储与检索 1. 概述 知识图谱中的知识表示:知识图谱中的知识是通过RDF的结构进行表示的,其基本构成单元是事实,每个事实被表示为一个形如<subject, predicate, object>(<主体, 谓词, 客体>)的三元组。其中: subject:其取值通常是实体、事实或者概念中的任何一个。 predicate:取值通常是关系或者属性。 object:取值既可以是实体、事件、概念,也可以是普通的值。 知识图谱的目标是构建一个能够刻画现实世界的知识库,为自动问答、信息检索等应用提供支撑。因此,对知识的持久化存储并提供对目标知识的高效检索是合格的知识图谱必须具备的基本功能。 2. 知识图谱的存储 按照存储方式的不同,知识图谱的存储可以分为基于表结构的存储和基于图结构的存储。 基于表结构的存储:利用二维的数据表对知识图谱中的数据进行存储:三元组表、类型表、关系数据库。 基于图结构的存储:利用图的方式对知识图谱中的数据进行存储:图数据库 2.1 基于表结构的存储 三元组表:知识图谱中的事实是一个个的三元组,一种最简单直接的存储方式是设计一张三元组表用于存储知识图谱中所有的事实。 优缺点: 优点:简单直接,易于理解。 缺点: 1. 整个知识图谱都存储在一张表中,导致单表的规模太大。对大表进行查询、插入、删除、修改等操作的开销很大,这将导致知识图谱的实用性受限。 2.

Facenet Triplet Loss

两盒软妹~` 提交于 2020-01-05 07:50:10
Triplet Loss 在人脸识别中,Triplet loss被用来进行人脸嵌入的训练。如果你对triplet loss很陌生,可以看一下吴恩达关于这一块的 课程 。Triplet loss实现起来并不容易,特别是想要将它加到tensorflow的计算图中。 通过本文,你讲学到如何定义triplet loss,和进行triplets采样的几种策略。然后我将解释如何在TensorFlow中使用在线triplets挖掘来实现Triplet loss。 Triplet loss和triplets挖掘 为什么不用softmax 谷歌的论文 FaceNet: A Unified Embedding for Face Recognition and Clustering 最早将triplet loss应用到人脸识别中。他们提出了一种实现人脸嵌入和在线triplet挖掘的方法,这部分内容我们将在后面章节介绍。 在监督学习中,我们通常都有一个有限大小的样本类别集合,因此可以使用softmax和交叉熵来训练网络。但是,有些情况下,我们的样本类别集合很大,比如在人脸识别中,标签集很大,而我们的任务仅仅是判断两个未见过的人脸是否来自同一个人。 Triplet loss就是专为上述任务设计的。它可以帮我们学习一种人脸嵌入,使得同一个人的人脸在嵌入空间中尽量接近,不同人的人脸在嵌入空间中尽量远离。

稀疏矩阵算法

亡梦爱人 提交于 2019-12-26 22:50:13
1、稀疏矩阵的压缩存储  为了节省存储单元,可只存储非零元素。由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须存储非零元素所在的行号、列号,才能迅速确定一个非零元素是矩阵中的哪一个元素。稀疏矩阵的压缩存储会失去随机存取功能。  其中每一个非零元素所在的行号、列号和值组成一个三元组(i,j,a ij ),并由此三元组惟一确定。  稀疏矩阵进行压缩存储通常有两类方法:顺序存储和链式存储。链式存储方法。 2、三元组表  将表示稀疏矩阵的非零元素的三元组按行优先(或列优先)的顺序排列(跳过零元素),并依次存放在向量中,这种稀疏矩阵的顺序存储结构称为三元组表。 注意:   以下的讨论中,均假定三元组是按行优先顺序排列的。        (1)三元组表的类型说明   为了运算方便,将矩阵的总行数、总列数及非零元素的总数均作为三元组表的属性进行描述。其类型描述为: #define MaxSize 10000 //由用户定义 typedef int DataType; //由用户定义 typedef struct { //三元组 int i,j;//非零元的行、列号 DataType v; //非零元的值 }TriTupleNode; typedef struct{ //三元组表 TriTupleNode data[MaxSize]; //三元组表空间 int m,n,t; /

三数之和 算法 双指针

帅比萌擦擦* 提交于 2019-12-15 00:47:04
题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 主要是需要去重 来源: CSDN 作者: Emily_1021 链接: https://blog.csdn.net/Emily_1021/article/details/103544164

论文解读:(TranSparse)Knowledge Graph Completion with Adaptive Sparse Transfer Matrix

社会主义新天地 提交于 2019-12-12 06:27:25
论文解读:(TranSparse)Knowledge Graph Completion with Adaptive Sparse Transfer Matrix   先前的基于深度学习的知识表示模型TransE、TransH、TransR(CTransR)和TransD模型均一步步的改进了知识表示的方法,在完善知识图谱补全工作上逐渐提高效果。通过先前的模型,我们基本掌握了知识表示的学习方法:首先通过投影策略将实体和关系映射到对应的语义空间,其次均使用得分函数 f ( h , t ) = ∣ ∣ h + r − t ∣ ∣ f(h,t)=||h+r-t|| f ( h , t ) = ∣ ∣ h + r − t ∣ ∣ 表示实体对的评分。另外使用负采样生成错误样本进行训练,使得正确的样本得分函数值降低,错误样本的得分函数值升高。然而这些模型均忽略了图谱的两个重要特性: 异质性(heterogeneity) 和 不平衡性(imbalance) 。图谱中的异质性是指不同关系对应的实体对数量不一致,例如对于关系 r r r 链接的所有实体对数量可能非常多,而对于 r ′ r' r ′ 链接的所有实体对数量可能只有1个。不平衡性是指头尾实体的数量不一致,例如形如对于(地名,local,洲名)的三元组,地名可能成千上万个,而洲名只有七个。由于数量的不对等