算法笔记

===================笛卡尔积:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//淘宝商城的商品的sku标识码用到笛卡尔积,将商品的所有种类特性拼接成唯一的id,比如衣服的 商标+尺寸+颜色+款式构成唯一标识;
namespace 笛卡尔积
{
class Program
{
static void Main(string[] args)
{
ColContainer colCon = new ColContainer();
List<Collection> licon = new List<Collection>();
//颜色种类
Collection coll = new Collection();
List<string> li = new List<string>();
li.Add("red");
li.Add("green");
li.Add("yellow");
coll.str = li;
licon.Add(coll);
//型号种类
coll = new Collection();
li = new List<string>();
li.Add("2.4");
li.Add("2.5");
li.Add("2.6");
coll.str = li;
licon.Add(coll);
colCon.list = licon;
//可以无限制添加特性集合;
//开始拼接
//定义拼接后的集合容器
List<string> listResult = new List<string>();
foreach (var lii in colCon.list)//遍历每个种类
{
//定义临时集合
List<string> listTem = new List<string>();
foreach (var liChild in lii.str)//遍历每个种类的所有特性
{
if (listResult.Count == 0)
{
listTem.Add(liChild);
}
else
{
foreach (var str in listResult)
{
listTem.Add(str + "_" + liChild);
}
}
}
listResult.Clear();
listResult.AddRange(listTem);
}
//listResult是最终结果
for (int i = 0; i < listResult.Count; i++)
{
Console.WriteLine(listResult[i]);
}
Console.Read();
}
}
//集合(模拟商品的特性,比如多种颜色、多种型号)
public class Collection
{
public List<string> str { get; set; }
}
//存放多个集合
public class ColContainer
{
public List<Collection> list{get;set;}
}
}


====================冒泡排序:

----------冒泡排序:

public static void Sort(int[] array)
{
int i, j; // 循环变量
int temp; // 临时变量
for (i = 0; i < array.Length - 1; i++)
{
for (j = 0; j < array.Length - 1 - i; j++)
{
if (array[j] > array[j + 1])
{s
// 交换元素
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}


--------------

3.
一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。

答:public class MainClass
{ public static void Main()
{ Console.WriteLine(Foo(30)); }
public static int Foo(int i) {
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2); } }

====

首先排序的方法有很多种:插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等

=========

排序:插入排序、选择排序、交换排序(快速排序,冒泡排序)

查找算法:顺序查找 二分查找(折半查找) 二叉排序树查找 哈希表法(散列表) 二叉排序树查找 分块查找

======

1、如果它的左子树不空,那么左子树上的所有结点值均小于它的根结点值;
2、如果它的右子树不空,那么右子树上的所有结点值均大于它的根结点值;
3、它的左右子树也分别为二叉查找树。

======

平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,

就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态


===========一致性哈希:

2.我们采用一致性哈希:

1.假如我们有三台服务器a,b,c
2.引入虚拟节点,a变成了a1到a100 100台
b变成了b1到b100 100台
c变成了c1到c100 100台

3.然后我们将300个点均匀的打乱到一个圆环上,360度的圆环上均匀分布着abc各100个点,
按照顺时针方向,转移命中。当将key通过一定算法得到一个度数后,获取圆上的点上的机器
宕机后,转移到顺时针下一个方向上的机器,这样我们就实现了,如果一台机器当掉,我们
在不影响其他机器上的数据的同时,又将命中坏掉的机器上的数据均匀转移到了其他服务器上。
很有意思。(比如c坏掉之后,100个点,会均匀按照顺时针转移,所以a和b各承担本应该命中c的一半)

====实现一致性哈希:
1.我们需要将字符串转成一个整数的过程,crc32()函数可以实现,转化为(0-2)的32次方 数字;
2.我们将服务器地址ip+端口也用crc32()得到整数;放到list中,并从小到大排序
(增加虚拟节点,for循环64个,重起64个虚拟名字,添加到lists)必须拿到虚节点,得出实际服务器节点。
3.通过key,计算crc32,判断落到哪个点上。遍历list,知道小于一个节点,则,就选择对应的机器。
4.如果宕机一台机器,算出64个虚拟节点的crc32值,从list中删除即可。

posted @ 2017-05-26 11:01  aiaito  阅读(651)  评论(0编辑  收藏  举报