比特币bittree
1. c结构体指针变量问题
你这么理解吧,typedef相当于把后面的类型重命名,
你可以替换理解一下,比如 typedef int INT,就是 INT等价int
那么如果是 typedef int *INT,就是*INT 等价 int ,想想看什么类型取* 会变成int?当然是int *类型了。
同理,你不该想*BitTree是什么类型,而是BitTree就是BitNode *,指向BitNode的指针。BitTree *p就是指向BitNode指针的指针
2. 比特币之前暴涨,为什么跌起来的速度更快
比特币价格加速上涨的同时,也出现了跌速更猛的回调。
根据比特币新闻资讯网Coindesk价格,1月11日,比特币价格一度跌至30305美元左右,较历史最高价41962美元下跌27.78%。换句话说,比特币价格从40000美元下跌至30305美元,仅隔短短的1天多的时间。而此前,从30000美元上升至40000美元,比特币花了6天时间。
从宏观经济大环境看,于佳宁认为,1月11日回调可以认为是海外主流投资机构采取的避险措施。他认为,比特币今年的上涨原因之一就是美元指数的持续下跌。目前拜登政府即将上台,“利空出尽就是利好”,美元有反弹可能,全球大宗商品资产都出现了大幅的回调,数字资产市场也随之调整。
近几日,美元指数已出现显著上涨,截至发稿,美元指数约为90.49,较前一日下降0.06,较1月6日收盘价89.42上升1.16%。
他还指出,不少比特币矿工选择在相对较高的价位进行抛售。从cq.live的数据上看,矿工头寸指数(MPI)已触及今年高位。MPI指数高于2,表明矿工在挖矿后倾向于出售比特币;如果MPI为负值,则表明他们对短期走势的看好,选择囤积比特币。目前该数值约为5.26,说明矿工们正在场外市场或交易所出售比特币。此外,ByteTree的数据同样显示,近一周内比特币矿工共计挖出6894个比特币,但出售了10047个比特币,这意味着矿工总体抛售了近3153枚比特币存货。
于佳宁提到,本次下跌还有一个原因就是美国最大的合规交易所Coinbase等交易平台在市场剧烈波动情况下后出现网站宕机,用户的交易被延迟,许多买入委托操作无法正常交易,这也导致了网站上的比特币价格远远低于市场价格,进一步加剧了市场恐慌。
“因为coinbase系统故障,导致昨天只能卖不能挂买单,买单无法成交,整个交易世界秩序被破坏了。”一位币圈从业人员也说道。
监管告诫比特币波动风险
值得注意的是,近期,比特币的大起大落也引起了各国监管部门的警惕。
1月12日,据新西兰先驱报(nzherald)报道,新西兰金融市场管理局(FMA)发布警告,告诫新西兰民众谨慎投资加密货币。
“考虑购买比特币之类的加密货币的新西兰人应该意识到,它们是高风险且高度波动的资产,”新西兰金融市场管理局发言人说,“加密货币在新西兰不受监管,骗子和黑客经常利用加密货币。”
而英国也在加强加密货币的监管,据1月9日《泰晤士报》报道,汇丰银行决定停止为英国的客户提供加密货币交易服务,包括禁止客户将资金从数字钱包存入汇丰银行。与此同时,许多其他英国银行都禁止客户使用信用卡购买比特币等数字货币。
“以稳定币为代表的虚拟货币正在面临愈加复杂的合规性风险。随着越来越多的经济活动迁移到区块链上,行业面临的合规压力非常大。USDT等稳定币的发行量在2020年达到爆发式增长,创下历史新高。在这背后,部分使用需求源自于合规的正常交易,但也存在洗钱、非法融资等存在问题的黑灰需求,未来区块链行业将遇到越来越多的合规挑战。”于佳宁表示。
他指出,PeckShield发布2020年年度虚拟货币反洗钱报告显示,2020年未受监管的出境虚拟货币价值达175亿美元,较2019年增长51%,且仍在快速增长。涉及虚拟货币的诈骗案件持续发,达到151起,较2019年增长655%。
于佳宁说:“2020年下半年开始,诈骗、攻击、勒索、赌博等产,以及洗钱、跑分等灰产,开始转为使虚拟货币洗钱,勒索类案件快速增长,虚拟货币反洗钱形势严峻,在2021年区块链和数字资产行业有必要采用更加严格审慎的KYC(认识你的客户)审查机制,执行更加严格的反洗钱标准。”
3. 求助,二叉树的查找结点问题
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int ElemType;
typedef struct BitNode{
ElemType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
BitTree CreateBiTree(void){
BitTree bt;
ElemType x;
scanf("%d",&x);
if(x==-1) bt=NULL; //安排空指针
else {
bt=(BitTree)malloc(sizeof(BitNode));
bt->data =x; //生成新结点
bt->lchild =CreateBiTree(); //建立左子树
bt->rchild =CreateBiTree(); //建立右子树
}
return bt; //返回根节点指针
}
void InOrderTraverse(BitTree bt) //中序遍历
{ if(bt!=NULL) {
InOrderTraverse(bt->lchild);
printf("%4d",bt->data);
InOrderTraverse(bt->rchild); }
}
int n=0;
int leafcount(BitTree bt)
{
if(bt!=NULL) {
if(bt->lchild==NULL&&bt->rchild==NULL) n++;
leafcount(bt->lchild);
leafcount(bt->rchild); }
return n;
}
BitTree exchangetree(BitTree bt){
BitTree t;
if(bt!=NULL) {
if(bt->lchild!=NULL||bt->rchild!=NULL)
{
t=bt->lchild;bt->lchild=bt->rchild;bt->rchild=t; }
bt->lchild=exchangetree(bt->lchild);
bt->rchild=exchangetree(bt->rchild); }
return bt;
}
int hightree(BitTree bt)
{
int H,H1,H2;
if(bt==NULL) H=0;
else{
H1=hightree(bt->lchild);
H2=hightree(bt->rchild);
H=(H1>H2?H1:H2)+1;
}
return H;
}
int find=0;
void searchtree(BitTree bt,ElemType x)
{
if(bt!=NULL&&!find)
if(bt->data==x)
{
find=1;
printf("结点存在\n");
return;
}
else
{
searchtree(bt->lchild,x);
searchtree(bt->rchild,x);
}
}
void main()
{
BitTree bt=NULL;
ElemType x;
int count=0,high=0;
bt=CreateBiTree();
printf("中序遍历:\n");
InOrderTraverse(bt);
printf("\n叶子节点的个数:\n");
count=leafcount(bt);
printf("%4d",count);
printf("\n交换左右子树:\n");
exchangetree(bt);
InOrderTraverse(bt);
printf("\n查找值为x的结点:\n");
printf("\n输入结点x=");
scanf("%d",&x);
searchtree(bt,x);
if(find==0)
printf("结点不存在\n");
printf("\n");
getchar();
}
哎哎,改了。。。。
运行结果:
1 2 -1 -1 3 -1 -1
中序遍历:
2 1 3
叶子节点的个数:
2
交换左右子树:
3 1 2
查找值为x的结点:
输入结点x=2
结点存在
Press any key to continue
4. bittree*t
BitreeT->定义Bitree一个实例对象:T; Bitree&T->定义Bitree的实例对象的引用,就是一个已经定义的对象的别名,需要初始化; /* 摘自 引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)。 intm; int&n=m; n相当于m的别名(绰号),对n的任何操作就是对m的操作。例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。 */ Bitree*T->定义Bitree的实例对象指针,指向一个实例对象; 代码参考: BitreeT; Bitree&T=T; Bitree*T=&T;//&是取地址.
5. typedef struct bitnode { int data; struct bitnode *l_ch,*r_ch; } bitnode,*bitree; 在这个结构体中,
bitnode和*bittree代表的东西都是一样的,都是二叉树的节点
不同的是bittree是一个指针类型
6. 比特币是一种什么货币能与人民币流通吗
比特币(Bitcoin)的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生[1]。根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的虚拟的加密数字货币。点对点的传输意味着一个去中心化的支付系统。
与所有的货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付。这同样确保了货币所有权与流通交易的匿名性。比特币与其他虚拟货币最大的不同,是其总数量非常有限,具有极强的稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久限制在约2100万个。
2017年1月24日中午12:00起,中国三大比特币平台正式开始收取交易费。
2017年9月4日,央行等七部委发公告称中国禁止虚拟货币交易。
2017年12月17日,比特币达到历史最高价19850美元。
2018年11月25日,比特币跌破4000美元大关,现稳定在3000多美元
2019年4月,比特币再次站上5000美元大关,创年内新高。
7. 比特币钱包
比特币(bitcoin)诞生于2008年的一篇论文。
一个署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?
Merkle tree
跟二叉树长得很像,只是这个是下面两个节点取哈希值得到上面节点。只需要记住根节点,就可以检测整棵树有没有被篡改。
根哈希值存在block header里,交易过程存在block body里。全节点包括block header和block body,但是轻节点(比如手机上比特币钱包)只包括block header。这棵树可以证明包含某个交易已经被写进了区块链。
3.共识协议
去中心化的货币要注意的两个问题:
1.谁能发行数字货币:挖矿。
2.怎么验证交易的合法性:区块链。
双花攻击(double spending attack)
双花攻击是数字货币的一个主要挑战。
比特币中的交易都要有输入和输出,币从哪来,花到哪去。
正常情况也可能有两个分叉,因为两个节点同时获得记账权,两个节点打包的区块,同时计算出了那个随机数。此时会暂时两个分叉共存,直到其中某一个区块抢先找到了下一个区块,这条就成了最长合法链,另一个分叉就被丢弃。
女巫攻击(sybil attack)
某恶意节点不停产生账户,账户总数超过总账户的一半,则取得了区块链的控制权。
比特币中的共识协议(Consensus)
一些节点是有恶意的,大部分节点是好的。
想法1:把一些交易打包到区块里作为候选区块,让每个区块投票,如果通过就写入区块链。
不行,因为有的恶意节点一直发布一些含有恶意交易的区块,则一直投票,占用资源。而且有的节点不投票。
想法2:不按账户个数投票,而是按照计算力投票。每个节点都可以产生合法交易放入区块,这些节点就开始试随机数,直到找到H(block header)≤ target,则这个节点有记账权。
唯一产生比特币的途径
coinbase transaction。这个不用指出币的来源,有了记账权的节点(找到了随机数)会有出块奖励。
50BTC->25BTC->12.5BTC,每21万个比特币,奖励就减半。
比特币争夺记账权的过程叫挖矿。争夺记账权的节点叫矿工。
8. 比较b-tree索引和bit-wise索引技术的区别,各自适用的场合
一.B-Tree索引:
1. 选项择索引字段的原则:
l 在WHERE子句中最频繁使用的字段
l 联接语句中的联接字段
l 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好)
l ORACLE在UNIQUE和主键字段上自动建立索引
l 在选择性很差的字段上建索引只有在这个字段的值分布非常倾斜的情况下下才有益(在这种情况下,某一,两个字段值比其它字值少出现很多)
l 不要在很少独特值的字段上建B-TREE索引,在这种情况下,你可以考虑在这些字段上建位图索引.在联机事务处理环境下,所由并发性非常高,索引经常被修改,所以不应该建位图索引
l 不要在经常被修改的字段上建索引.当有UPDATE,DELETE,INSETT操作时,ORACLE除了要更新表的数据外,同时也要更新索引,而且就象更新数据一样,或产生还原和重做条目
l 不要在有用到函数的字段上建索引,ORACLE在这种情况,优化器不会用到索引,除非你建立函数索引
l 可以考虑在外键字段上建索引,这些索引允许当在主表上UPDATE,DELETE操作时,不需要共享子表的锁,这非常适用于在父表和子表上有很多并发的INSERT,UPDATE和DELETE操作的情况
l 当建立索引后,请比较一下索引后所获得的查询性能的提高和UPDATE,DELETE,INSERT操作性能上的损失,比较得失后,再最后决定是否需建立这个索引
2. 选择建立复合索引
复合索引的优点:
l 改善选择性:复合索引比单个字段的索引更具选择性
l 减少I/O:如果要查询的字段刚好全部包含在复合索引的字段里,则ORACLE只须访问索引,无须访问表
什么情况下优化器会用到复合索引呢?
(a)当SQL语句的WHERE子句中有用到复合索引的领导字段时,ORACLE优化器会考虑用到复合索引来访问.
(b)当某几个字段在SQL语句的WHERE子句中经常通过AND操作符联合在一些使用作为过滤谓词,并且这几个字段合在一起时选择性比各自单个字段的选择性要更好时,可能考虑用这几个字段来建立复合索引.
(c)当有几个查询语句都是查询同样的几个字段值时,则可以考虑在这几个字段上建立复合索引.
复合索引字段排序的原则:
l 确保在WHERE子句中使用到的字段是复合索引的领导字段
l 如果某个字段在WHERE子句中最频繁使用,则在建立复合索引时,考虑把这个字段排在第一位(在CREATE INDEX语句中)
l 如果所有的字段在WHERE子句中使用频率相同,则将最具选择性的字段排在最前面,将最不具选择性的字段排在最后面
l 如果所有的字段在WHERE子句中使用频率相同,如果数据在物理上是按某一个字段排序的,则考虑将这个字段放在复合索引的第一位
B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。
不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。
一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就 是所有实际需要的数据都存放于 Tree 的 Leaf Node ,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,所以我们大家都称之为 B-Tree 索引当然,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际上是 B+Tree ,也就是在 B-Tree 数据结构的基础上做了很小的改造,在每一个
Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息,这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。
二、bit-wise原理
bit-wise原理,表存在两个列AA和BB。我们现在要在AA上建bit-wise索引。
1.生成索引
计算bit vector的数量
针对AA列,我们用32bit整数(实际上只需3bit来表达,为了描述更通用的情况,所以用了32bit)来表达AA列上的值,我们需要32个bit vector。
2.生成bit-wise索引
bit vector中的位图的数量与表中记录的数量一样。
3.单值查找
假设我们执行条件为where AA=1的查询。1的二进制表示是{0…0,1},分别与bit-vector执行and运算,结果见图3。通过结果bit-vector即可获取目标记录,通过bit-vector进行集合运算也是非常方便的,比如count运算。
在 Innodb 存储引擎中,存在两种不同形式的索引,一种是 Cluster 形式的主键索引( Primary Key ),另外一种则是和其他存储引擎(如 MyISAM 存储引擎)存放形式基本相同的普通 B-Tree 索引,这种索引在 Innodb 存储引擎中被称为 Secondary Index 。下面我们通过图示来针对这两种索引的存放形式做一个比较。
9. typedef用法BiTNode,*BiTree;都是什么,起什么作用的
BiTNode BiTNode类型,
*BiTree 指向BiTNode类型的指针;
定义一个BiTNode类型a:
BiTNode a ;
BiTree a = BiTNode *a;
10. 为什么B-TREE索引不适合数据仓库
假如有个表ID,mingzi,bumen
如果对ID建索引,可以建成btree,而对部门建索引,则不适合建btree。参考btree的结构:它适合区分度高的、也就是维度高的。而bitmap索引适合区分度低的。
数据仓库中海量数据对单列而言数据重复度可能会比较高,而且btree存储开销非常大。而bitmap正好适合。