Java(31):数据结构排序---对接口 Comparable<T> 与 接口 Comparator<T> 的区别理解

Java中Comparable<T>与Comparator<T>的使用——对数组中数据进行自定义排序 Comparable<T>和Comparator<T>是Java中适用于不同情景下的用来对数据进行比较(排序)的两个接口。 下面举例展示Comparable接口的使用 情景:当前 阅读详情

日期:2017/11/19

     接口 Comparable<T> 与 接口 Comparator<T> 的区别


一、接口 Comparable<T> 

java.lang 
接口 Comparable<T>

类型参数:
T - 可以与此对象进行比较的那些对象的类型
所有已知子接口:
Delayed,  Name,  RunnableScheduledFuture<V>,  ScheduledFuture<V>
所有已知实现类:
Authenticator.RequestorType,  BigDecimal,  BigInteger,  Boolean,  Byte,  ByteBuffer,  Calendar,  Character,  CharBuffer,  Charset,  ClientInfoStatus,  CollationKey,  Component.BaselineResizeBehavior,  CompositeName,  CompoundName,  Date,  Date,  Desktop.Action,  Diagnostic.Kind,  Dialog.ModalExclusionType,  Dialog.ModalityType,  Double,  DoubleBuffer,  DropMode,  ElementKind,  ElementType,  Enum,  File,  Float,  FloatBuffer,  Formatter.BigDecimalLayoutForm,  FormSubmitEvent.MethodType,  GregorianCalendar,  GroupLayout.Alignment,  IntBuffer,  Integer,  JavaFileObject.Kind,  JTable.PrintMode,  KeyRep.Type,  LayoutStyle.ComponentPlacement,  LdapName,  Long,  LongBuffer,  MappedByteBuffer,  MemoryType,  MessageContext.Scope,  Modifier,  MultipleGradientPaint.ColorSpaceType,  MultipleGradientPaint.CycleMethod,  NestingKind,  Normalizer.Form,  ObjectName,  ObjectStreamField,  Proxy.Type,  Rdn,  Resource.AuthenticationType,  RetentionPolicy,  RoundingMode,  RowFilter.ComparisonType,  RowIdLifetime,  RowSorterEvent.Type,  Service.Mode,  Short,  ShortBuffer,  SOAPBinding.ParameterStyle,  SOAPBinding.Style,  SOAPBinding.Use,  SortOrder,  SourceVersion,  SSLEngineResult.HandshakeStatus,  SSLEngineResult.Status,  StandardLocation,  String,  SwingWorker.StateValue,  Thread.State,  Time,  Timestamp,  TimeUnit,  TrayIcon.MessageType,  TypeKind,  URI,  UUID,  WebParam.Mode,  XmlAccessOrder,  XmlAccessType,  XmlNsForm

public interface Comparable<T>

     此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

     实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

     对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也将抛出 NullPointerException。

     建议(虽然不是必需的)最好使自然排序与 equals 一致。这是因为在使用自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。

     例如,如果将两个键 a 和 b 添加到没有使用显式比较器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那么第二个 add 操作将返回 false(有序集合的大小没有增加),因为从有序集合的角度来看,a 和 b 是相等的。

     实际上,所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。

     从数学上讲,定义给定类 C 上自然排序的关系式 如下:

      {(x, y)|x.compareTo(y) <= 0}。
     整体排序的 商  是:
      {(x, y)|x.compareTo(y) == 0}。
     它直接遵循  compareTo  的协定,商是  C  的 等价关系 ,自然排序是  C  的 整体排序 。当说到类的自然排序 与 equals 一致  时,是指自然排序的商是由类的  equals(Object)  方法定义的等价关系。
    {(x, y)|x.equals(y)}。

     此接口是 Java Collections Framework 的成员。


方法摘要
 intcompareTo(T o) 
          比较此对象与指定对象的顺序。
 

方法详细信息

compareTo

int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

实现类必须确保对于所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的关系。(这意味着如果 y.compareTo(x) 抛出一个异常,则 x.compareTo(y) 也要抛出一个异常。)

实现类还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着 x.compareTo(z)>0。

最后,实现者必须确保 x.compareTo(y)==0 意味着对于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但并不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”

在前面的描述中,符号 sgn(expression) 指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回 -1、0 或 1 中的一个值。

参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。


例子1:


package com.code.CompareInterface.ComparableInterface;

//类型 Person 必须实现继承的抽象方法 Comparable<String>.compareTo(String)
public class Person implements Comparable<Person>{
	private String name;
	private Integer age;
	public Person(){		
	}
	public Person (String name ,Integer age){
		this.name = name;
		this.age = age;
	}
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(Integer age){
		this.age = age;
	}
	public Integer getAge(){
		return age;
	}

	@Override
	public int compareTo(Person p) {
		//auto 比较age
		if(this.age > p.age){
			return (this.age - p.age);
		}if(this.age < p.age){
			return (this.age - p.age);
		}		
		//auto 比较name
		if(this.name.compareTo(p.name) > 0){
			return 1;
		}
		if(this.name.compareTo(p.name) < 0){
			return -1;
		}
		return 0;
	}

}

package com.code.CompareInterface.ComparableInterface;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

public class ComparableTest {
	
	public static void main(String [] args){
		Person p1 = new Person("AA",19);
		Person p2 = new Person("aa",13);
		Person p3 = new Person("CC",13);
		Person p4 = new Person("DD",14);
		
		//不能实例化类型 List<Person>
		List<Person> list = new ArrayList<Person>();		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		ListIterator it = list.listIterator();
		System.out.println(list.size());
		while(it.hasNext()){
			Person s = new Person();
			s = (Person) it.next();
			System.out.println(s.getName()+ "---"+s.getAge());
		}
		System.out.println("------------------------");
		//回到正题,进行排序
		Collections.sort(list);		
		for(Person p : list){
			System.out.println(p.getName()+"---"+p.getAge());
		}
	
	}
	
	
}

输出结果:


4
AA---19
aa---13
CC---13
DD---14
------------------------
CC---13
aa---13
DD---14
AA---19

解释:(1)从Person.java 重写的compareTo()可以看出先是比较age值大小,再以name的Unicode序号作为排序依据。



二、接口 Comparator<T> 

java.util 
接口 Comparator<T>

类型参数:
T - 此 Comparator 可以比较的对象类型
所有已知实现类:
Collator,  RuleBasedCollator

public interface Comparator<T>

      强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

      当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,c.compare(e1, e2)==0 与 e1.equals(e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与 equals 一致 的排序。

      当使用具有与 equals 不一致的强行排序能力的 Comparator 对有序 set(或有序映射)进行排序时,应该小心谨慎。假定一个带显式 Comparator c 的有序 set(或有序映射)与从 set S 中抽取出来的元素(或键)一起使用。如果 c 强行对 S 进行的排序是与 equals 不一致的,那么有序 set(或有序映射)将是行为“怪异的”。尤其是有序 set(或有序映射)将违背根据 equals 所定义的 set(或映射)的常规协定。

      例如,假定使用 Comparator c 将满足 (a.equals(b) && c.compare(a, b) != 0) 的两个元素 a 和 b 添加到一个空 TreeSet 中,则第二个 add 操作将返回 true(树 set 的大小将会增加),因为从树 set 的角度来看,a 和 b 是不相等的,即使这与 Set.add 方法的规范相反。

      注:通常来说,让 Comparator 也实现 java.io.Serializable 是一个好主意,因为它们在可序列化的数据结构(像 TreeSet、TreeMap)中可用作排序方法。为了成功地序列化数据结构,Comparator(如果已提供)必须实现 Serializable。

      在算术上,定义给定 Comparator c 对给定对象 set S 实施强行排序 的关系式 为:

       {(x, y) such that c.compare(x, y) <= 0}.
      此整体排序的 商 (quotient)  为:
       {(x, y) such that c.compare(x, y) == 0}.
 
      它直接遵循  compare  的协定,商是  S  上的 等价关系 ,强行排序是  S  上的 整体排序 。当我们说  c  强行对  S  的排序是 与 equals 一致  的时,意思是说排序的商是对象的  equals(Object)  方法所定义的等价关系:
       {(x, y) such that x.equals(y)}. 

此接口是 Java Collections Framework 的成员。

方法摘要
 intcompare(T o1, T o2) 
          比较用来排序的两个参数。
 booleanequals(Object obj) 
          指示某个其他对象是否“等于”此 Comparator。
 

方法详细信息

compare

int compare(T o1,
            T o2)
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

在前面的描述中,符号 sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -1、0 或 1。

实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)

实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。

最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。

虽然这种情况很普遍,但并不 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背这个条件的 Comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 Comparator 强行进行与 equals 不一致的排序。”

参数:
o1 - 要比较的第一个对象。
o2 - 要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
抛出:
ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。

equals

boolean equals(Object obj)
指示某个其他对象是否“等于”此 Comparator。此方法必须遵守  Object.equals(Object) 的常规协定。此外, 仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回  true。因此, comp1.equals(comp2) 意味着对于每个对象引用  o1 和  o2 而言,都存在  sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。

注意,不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。

覆盖:
类  Object 中的  equals
参数:
obj - 要进行比较的引用对象。
返回:
仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回  true。
另请参见:
Object.equals(Object),  Object.hashCode()

例子2:


package com.code.CompareInterface.Comparator;

import java.util.Comparator;
//类型 Person 必须实现继承的抽象方法 Comparator<Person>.compare(Person, Person)
public class Person implements Comparator<Person>{
	private String name;
	private Integer age;
	public Person(){		
	}
	public Person (String name ,Integer age){
		this.name = name;
		this.age = age;
	}
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(Integer age){
		this.age = age;
	}
	public Integer getAge(){
		return age;
	}
	@Override
	public int compare(Person p1, Person p2) {
		if(p1.getAge() > p2.getAge()){
			return 1;
		}else if(p1.getAge() < p2.getAge()){
			return -1;
		}else{
			if(p1.getName().compareTo(p2.getName()) > 0){
				return 1;
			}else if(p1.getName().compareTo(p2.getName()) > 0){
				return -1;
			}else{
				return 0;
			}
		}
	}

}



package com.code.CompareInterface.Comparator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;

import com.code.CompareInterface.ComparableInterface.Person;

public class ComparatorTest {

	public static void main(String[] args) {
		Person p1 = new Person("AA",19);
		Person p2 = new Person("aa",13);
		Person p3 = new Person("CC",13);
		Person p4 = new Person("DD",14);
		
		//不能实例化类型 List<Person>
		List<Person> list = new ArrayList<Person>();		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		ListIterator it = list.listIterator();
		System.out.println(list.size());
		while(it.hasNext()){
			Person s = new Person();
			s = (Person) it.next();
			System.out.println(s.getName()+ "---"+s.getAge());
		}
		System.out.println("------------------------");
		
		//区别与Compearable接口
		Collections.sort(list);
		for(Person p : list){
			System.out.println(p.getName()+"---"+p.getAge());
		}
	
	}

}

输出结果:

4
AA---19
aa---13
CC---13
DD---14
------------------------
CC---13
aa---13
DD---14
AA---19

验证了:使用两种接口达到一样的效果。


三、两者区别

       Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。



【数据结构与算法_java】面试题及答案汇总 文章目录一、剑指offer:50道金典面试题题目1:赋值运算符函数面试题2:实现单例模式面试题3:二维数组中的查找二、LeetCode上经典题目三、其他金典面试题 前    言 本文将收录《剑指offer:50道金典面试题》、LeetCode上部分经典题目以及其他【据结构和算法】数面试题。 PS:持续更新中,敬请期待~~ 正    文 一、剑指offer:50道金典面试题 题目 阅读详情

相关推荐

LoRA学习: SX1276/SX1277/SX1278对比

Lora芯片 SX1276/SX1277/SX1278的比较SX1276/7/8是一种半双工传输的低中频收发器,配备标了标准FSK和远距离扩频Lora调制解调器。该芯片可以用于超长距离的Lora扩频通信,并且抗干扰性强,同时达到低功耗要求。1、芯片关键参数对比: 可以看出SX1276的带宽范围为 7.8~500kHz ,扩频 因子6~12,并覆盖所有可用频段。 SX1277的带宽和频段方位与 S

HowieXue 薛永浩的博客 1万+

java 接口之 Comparable<T> 与 Comparator <T>

java 接口之 Comparable 与 Comparator

牛牛博士博客 878

Java面试题超详细讲解系列之五【数据结构与算法篇】

图例结合五万字超详细讲解数据结构与算法面试会遇到的那些题

白大锅的博客,毕设WangLoveBai_999 5088

Java中Comparator接口使用

介绍Comparator接口,重写Arrays.sort方法。

weixin_45730969的博客 709

31、Java集合框架:深入理解与应用

本博客深入解析了Java集合框架的核心内容,涵盖List、Set、Queue和Map等主要数据结构的特点及应用场景。通过详细讲解集合接口、遍历方式、常用操作方法以及典型实现类(如ArrayList、LinkedList、HashSet、HashMap等),帮助开发者更好地理解和应用集合框架。此外,还介绍了泛型、通配符、集合工具类等高级特性,并通过实际示例展示常见问题的解决方案。

web39explorer的博客 118

一些 工作中 常见 英语 单词

一些 工作中 常见 英语 单词 一些 工作中 常见 英语 单词 一些 工作中 常见 英语 单词

java中Comparable<T>与Comparator<T>的使用与区别

1.comparable的使用 comparable(内部比较器,比较属性,静态绑定)是一个排序接口,当某个类实现该接口后,该类就具备了排序的能力,前提是该类的属性具备排序的条件。实现comparable接口,Override接口的方法compareTo。一般来说,如果创建一个类,该类具有排序的属性,最好是实现该接口。 comparable接口的源码 现在我们就用一些具体的例子来说明comparable的使用。 import java.lang.reflect.Array; import java.uti

蜡笔小贤的博客 670

_〖第6章:面向对象(高级)〗java_实例分析:宠物商店笔记

_〖第6章:面向对象(高级)〗_实例分析:宠物商店笔记,提炼编程能力

Java集合框架之Comparable排序接口

如果类的自然排序逻辑就是所需要的排序方式,并且不会改变,那么应该实现Comparable接口。如果需要为类提供多种排序方式,或者需要对没有实现Comparable接口的类进行排序,那么应该使用Comparator。Comparator提供了更高的灵活性,它允许为同一个类定义多个不同的排序方式,并且可以用于比较任何对象Comparable在类的自然排序逻辑简单,且不会改变的情况下更为方便。

weixin_44348521的博客 491

华三 无线AP密码修改步骤

华三无线AP配置,包含Web和命令行两种。这是FAT AP的配置,仅供参考!

wap乐购商城程序

乐购商城WAP建站程序 简单WAP商城,只要你会打字就可以建WAP商城,简单容易,易上手。 后台地址:/admin/login.asp 用户名与密码:admin

java list排序工具类_java 之 Collections集合工具类排序

数组有工具类Arrays,集合也有一个工具类Collections。sort方法:sort(List list):根据其元素natural ordering对制定的列表进行排序sort(List list, Comparator super T> c):根据指定的比较器引起的顺序对指定的列表进行排序案例:package com.gongxy.demo;public class Persion...

weixin_30631569的博客 706

filemanager

filemanager 密码admin 账号admin

数据结构与算法之插入排序

package com.qiangqiang.sort; import java.util.Random; /** * \* Created with IntelliJ IDEA. * \* @author: xiyue * \* Date: 2020/12/31 * \* Time: 16:39 * \* To change this template use File | Settings | File Templates. * \* Description: * \ */ publ

京北游戏官方 6965

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 750

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

31、Java集合概述

集合是一组对象的集合,它封装了对象的存储和操作方式。集合框架提供了一组接口和类,用于存储、访问和操作这些对象集合。这些接口和类定义了不同的数据结构,如列表、集合、映射等,以支持各种类型的数据操作。简单来说,集合是对象的容器,它允许你将多个对象存储在一个单一的数据结构中,并对这些对象进行各种操作,如添加、删除、搜索等。Java集合框架的设计旨在提供一种统一的方式来处理不同类型的集合,从而简化代码的编写和理解。集合类位于java.util包下,都是Collection和Map派生而来的。

2402_87701017的博客 1074

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3459

leetcode-31-下一个排列-java

题目及测试 package pid031; /*31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 123 132 213 231 312 321 1,1,5 → 1,5,1 1234 1243 1324 1342

今天吃了吗的博客 303

保姆级教程:在爱快iKuai虚拟机里装OpenWrt旁路由,实现去广告和特殊功能

本文提供在爱快iKuai虚拟机中安装OpenWrt旁路由的详细教程,帮助用户实现去广告和特殊功能扩展。通过分步指导,包括虚拟机配置、网络设置和功能优化,打造稳定高效的家庭网络环境,特别适合软路由爱好者和网络管理员。

weixin_31364787的博客 823

AI驱动的网络安全运维:智能化时代的安全保障

本项目旨在使用Python和AI技术构建一个智能化的网络安全运维系统,能够实时监测网络流量,检测潜在的安全威胁,并自动采取应对措施,从而提升网络安全管理的效率和准确性。具体内容包括:环境配置与依赖安装数据采集与预处理机器学习模型构建与训练实时威胁检测与响应实际应用案例通过本文的介绍,我们展示了如何使用Python和AI技术构建一个智能化的网络安全运维系统。

Echo_Wish 1290

2020.10.31java数组的冒泡排序、选择排序、插入排序

1.冒泡排序 public class Bubble { //冒泡排序 public static void main(String[] args){ int[] array={2,9,45,8,3,1}; //2,9,8,3,1,45 //2,8,3,1,9,45 //2,3,1,8,9,45 //2,1,3,8,9,45 //1,2,3,8,9,45 Bubble.sort(a

weixin_45649686的博客 159

YOLOv11改进 | 引入SFSConv空间频率选择卷积(含SFSC3k2二次创新),空间频率特征协同作用,检测性能全面提升

本文提出在YOLOv11中引入SFSConv空间频率选择卷积模块,通过显式分离和动态融合空间域与频率域特征,解决传统卷积对多尺度目标检测的局限性。SFSConv包含空间频率分离、动态权重融合和协同特征重建三个核心机制,并进一步创新提出SFSC3k2结构,通过双路频率分支增强特征协同作用。该改进显著提升了YOLOv11在遥感、医学等多尺度复杂场景下的检测性能,实验显示在微小目标检测任务中mAP提升5%-10%。代码实现展示了SFSConv模块的核心逻辑及其在PyTorch中的高效实现。

走向CTO的路上... 767

java数据结构折半查找和二叉排序树

一、实验目的 1、掌握查找的特点。 2、掌握折半查找的基本思想及其算法。 3、熟悉二叉排序树的特点,掌握二叉排序树的插入、删除操作。 二、实验内容 1、设有关键字序列k={ 5 ,14 ,18 ,21 ,23 ,29 ,31 ,35 },查找key=21和key=25的数据元素。 2、根据关键字序列{45、24、53、12、37、93}构造二叉排序树,并完成插入13删除关键字53和24的操作。 三...

sticker_start_tag的博客 1164

解锁激光加工密码:功率、频率、脉宽、占空比全解析

激光加工利用高能量激光束实现材料加工,具有无接触、高效率等特点。其核心参数包括功率(决定能量输出)、频率(控制脉冲重复)、脉宽(调节能量作用时间)和占空比(调控工作周期),这些参数相互协同影响加工效果。针对不同材料需采用差异化参数组合:金属材料需较高功率,塑料需低功率防过热,陶瓷需高频短脉宽减少热应力。实际操作中应通过小范围测试逐步优化参数,并注意解决烧损、切割不平整等常见问题。合理调节这些参数可实现高质量、高效率的激光加工。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 614

magic-api的鉴权机制配置 (附实战代码)

引入magic-api及相关数据库驱动依赖 配置yml文件和编辑器JS文件 实现登录鉴权逻辑,包括用户验证和Token处理 接口鉴权拦截器设计,确保接口访问安全性 文章提供了完整的代码示例,帮助开发者快速集成magic-api框架并实现权限控制功能。

码农研究僧的博客 227
上一篇: java(21):数据结构(4)--Map
下一篇: Eclipse:快速添加get、set方法
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值