VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1503|回复: 9

请问在.net中如何比较两个字节数组效率最高

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-24 01:30:02 | 显示全部楼层 |阅读模式
请问在.net中如何比较两个字节数组效率最高
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-14 11:30:01 | 显示全部楼层
先比较长度,如果相同直接比较每个元素不就行了?遇到不同的就返回。

回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-7-14 14:45:01 | 显示全部楼层
for example;

static bool ByteEquals(byte[] b1, byte[] b2)
        {        
            if (b1 == null || b2 == null) return false;
            if (b1.Length != b2.Length) return false;
            for (int i = 0; i < b1.Length; i++)
                if (b1[i] != b2[i])
                    return false;
            return true;
        }   
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-7-17 06:45:01 | 显示全部楼层
我记得.net中好像有一个比较两个内存区数据是否相同的指令,我是指那个
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-7-17 19:15:01 | 显示全部楼层
算法上基本上没有什么可优化的
不过可以使用以下两种方式来处理,均可以得到部分效率的提升
1、使用基于堆栈的数组
byte* byteArray= stackalloc byte[10];
因为基于堆栈的数组不检查溢出,因此可以获得更好的性能,而且由于是在栈上使用不存在内存释放的问题,而且不需要垃圾收集
2、使用指针
fixed (byte* p1 = &b1[0])
这样可以不用检查数组边界,直接用指针的++来进行处理,二是垃圾收集不会移动数组
但是以上两种方式均需要通过/Unsafe方式编译
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-5 17:15:01 | 显示全部楼层
public unsafe static bool ByteArraysEqual(byte[] b1, byte[] b2)
        {
            if (b1 == b2) return true;
            if (b1 == null || b2 == null) return false;
            if (b1.Length != b2.Length) return false;
            int len = b1.Length;
            fixed (byte* p1 = b1, p2 = b2)
            {
                int* i1 = (int*)p1;
                int* i2 = (int*)p2;
                while (len >= 4)
                {
                    if (*i1 != *i2) return false;
                    i1++;
                    i2++;
                    len -= 4;
                }
                byte* c1 = (byte*)i1;
                byte* c2 = (byte*)i2;
                while (len > 0)
                {
                    if (*c1 != *c2) return false;
                    c1++;
                    c2++;
                    len--;
                }
            }
            return true;
        }
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-5 17:30:01 | 显示全部楼层
比较有多方面的,我这里有一个类似的 求得 字符串的最长公共子串的方法,可以参考
[url=http://blog.csdn.net/hackjojo/article/details/6708109][/url]
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-5 17:45:01 | 显示全部楼层
1、如果楼主指的是“代码最少”:
byte[] b1 = new byte[5];
byte[] b2 = new byte[5];
bool bb = b1.Equals(b2);
布尔值bb就是比较结果

2、如果楼主指的是“速度最快”:
参考3楼和6楼的
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-5 18:00:01 | 显示全部楼层
C#的四种排序算法:冒泡排序(2016-12-29 09:41:31)转载 分类: C#  
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    /// <summary>
    /// 冒泡排序
    /// </summary>
    public class BubbleSorter
    {
        public void Sort(int[] list)
        {
            int i, j, temp;
            bool done = false;
            j = 1;
            while((j<list.Length)&&(!done))
            {
                done = true;
                for (i=0;i<list.Length-j;i++)
                {
                    if (list[i]>list[i+1])
                    {
                        done = false;
                        temp = list[i];
                        list[i] = list[i + 1];
                        list[i + 1] = temp;
                    }
                }
                j++;
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
            //冒泡排序
            BubbleSorter bs=new BubbleSorter();
            bs.Sort(iArrary);
            for(int m=0;m<iArrary.Length;m++)
            Console.Write("{0} ",iArrary[m]);
            Console.WriteLine();
        }
    }
}



C#的四种排序算法:选择排序
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    /// <summary>
    /// 选择排序
    /// </summary>
    class SelectionSorter
    {
        private int min;
        public void Sort(int [] list)
        {
            for(int i=0;i<list.Length-1;i++)
            {
                min=i;
                for(int j=i+1;j<list.Length;j++)
                {
                    if(list[j]<list[min])
                        min=j;
                }
                int t=list[min];
                list[min]=list[i];
                list[i]=t;
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
            //选择排序
            //SelectionSorter ss = new SelectionSorter();
            //ss.Sort(iArrary);
            //
            for(int m=0;m<iArrary.Length;m++)
            Console.Write("{0} ",iArrary[m]);
            Console.WriteLine();
        }
    }
}





C#的四种排序算法:插入排序
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    /// <summary>
    /// 插入排序
    /// </summary>
    class InsertionSorter
    {
        public void Sort(int [] list)
        {
            for(int i=1;i<list.Length;i++)
            {
                int t=list[i];
                int j=i;
                while((j>0)&&(list[j-1]>t))
                {
                    list[j]=list[j-1];
                    --j;
                }
                list[j]=t;
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
            //插入排序
            InsertionSorter ins = new InsertionSorter();
            ins.Sort(iArrary);
            for(int m=0;m<iArrary.Length;m++)
            Console.Write("{0} ",iArrary[m]);
            Console.WriteLine();
        }
    }
}



C#的四种排序算法:希尔排序(2016-12-29 10:24:18)转载 分类: C#  
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    /// <summary>
    /// 希尔排序,希尔排序是将组分段,进行插入排序.
    /// </summary>
    class ShellSorter
    {
        public void Sort(int [] list)
        {
            int inc;
            for(inc=1;inc<=list.Length/9;inc=3*inc+1);
            for(;inc>0;inc/=3)
            {
                for(int i=inc+1;i<=list.Length;i+=inc)
                {
                    int t=list[i-1];
                    int j=i;
                    while((j>inc)&&(list[j-inc-1]>t))
                    {
                        list[j-1]=list[j-inc-1];
                        j-=inc;
                    }
                    list[j-1]=t;
                }
            }               
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;
namespace SortDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
            //希尔排序
            ShellSorter shs = new ShellSorter();
            shs.Sort(iArrary);
            //显示
            for(int m=0;m<iArrary.Length;m++)
            Console.Write("{0} ",iArrary[m]);
            Console.WriteLine();
        }
    }
}
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-9-5 18:15:01 | 显示全部楼层
楼上的还要排序的吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表