❶ 关于择业,对于我的情况,算法和开发该选哪个好
建议你去做算法。
既然都不好找,为什么不找个你擅长的。
做了开发,越做越废,不会有机会转回去的。
❷ 请问高手,神经网络模型与学习算法用什么语言编程比较好JAVA 、C语言还是C++等。谢谢!
个人建议,用Java,毕竟它对网络的针对性较强,而学习算法可以从C开始再到java因为从小到大比较好…
❸ 什么网络加密的算法
由于网络所带来的诸多不安全因素使得网络使用者不得不采取相应的网络安全对策。为了堵塞安全漏洞和提供安全的通信服务,必须运用一定的技术来对网络进行安全建设,这已为广大网络开发商和网络用户所共识。
现今主要的网络安全技术有以下几种:
一、加密路由器(Encrypting Router)技术
加密路由器把通过路由器的内容进行加密和压缩,然后让它们通过不安全的网络进行传输,并在目的端进行解压和解密。
二、安全内核(Secured Kernel)技术
人们开始在操作系统的层次上考虑安全性,尝试把系统内核中可能引起安全性问题的部分从内核中剔除出去,从而使系统更安全。如S olaris操作系统把静态的口令放在一个隐含文件中, 使系统的安全性增强。
三、网络地址转换器(Network Address Translater)
网络地址转换器也称为地址共享器(Address Sharer)或地址映射器,初衷是为了解决IP 地址不足,现多用于网络安全。内部主机向外部主机连接时,使用同一个IP地址;相反地,外部主机要向内部主机连接时,必须通过网关映射到内部主机上。它使外部网络看不到内部网络, 从而隐藏内部网络,达到保密作用。
数据加密(Data Encryption)技术
所谓加密(Encryption)是指将一个信息(或称明文--plaintext) 经过加密钥匙(Encrypt ionkey)及加密函数转换,变成无意义的密文( ciphertext),而接收方则将此密文经过解密函数、解密钥匙(Decryti on key)还原成明文。加密技术是网络安全技术的基石。
数据加密技术要求只有在指定的用户或网络下,才能解除密码而获得原来的数据,这就需要给数据发送方和接受方以一些特殊的信息用于加解密,这就是所谓的密钥。其密钥的值是从大量的随机数中选取的。按加密算法分为专用密钥和公开密钥两种。
专用密钥,又称为对称密钥或单密钥,加密时使用同一个密钥,即同一个算法。如DES和MIT的Kerberos算法。单密钥是最简单方式,通信双方必须交换彼此密钥,当需给对方发信息时,用自己的加密密钥进行加密,而在接收方收到数据后,用对方所给的密钥进行解密。这种方式在与多方通信时因为需要保存很多密钥而变得很复杂,而且密钥本身的安全就是一个问题。
DES是一种数据分组的加密算法,它将数据分成长度为6 4位的数据块,其中8位用作奇偶校验,剩余的56位作为密码的长度。第一步将原文进行置换,得到6 4位的杂乱无章的数据组;第二步将其分成均等两段 ;第三步用加密函数进行变换,并在给定的密钥参数条件下,进行多次迭代而得到加密密文。
公开密钥,又称非对称密钥,加密时使用不同的密钥,即不同的算法,有一把公用的加密密钥,有多把解密密钥,如RSA算法。
在计算机网络中,加密可分为"通信加密"(即传输过程中的数据加密)和"文件加密"(即存储数据加密)。通信加密又有节点加密、链路加密和端--端加密3种。
①节点加密,从时间坐标来讲,它在信息被传入实际通信连接点 (Physical communication link)之前进行;从OSI 7层参考模型的坐标 (逻辑空间)来讲,它在第一层、第二层之间进行; 从实施对象来讲,是对相邻两节点之间传输的数据进行加密,不过它仅对报文加密,而不对报头加密,以便于传输路由的选择。
②链路加密(Link Encryption),它在数据链路层进行,是对相邻节点之间的链路上所传输的数据进行加密,不仅对数据加密还对报头加密。
③端--端加密(End-to-End Encryption),它在第六层或第七层进行 ,是为用户之间传送数据而提供的连续的保护。在始发节点上实施加密,在中介节点以密文形式传输,最后到达目的节点时才进行解密,这对防止拷贝网络软件和软件泄漏也很有效。
在OSI参考模型中,除会话层不能实施加密外,其他各层都可以实施一定的加密措施。但通常是在最高层上加密,即应用层上的每个应用都被密码编码进行修改,因此能对每个应用起到保密的作用,从而保护在应用层上的投资。假如在下面某一层上实施加密,如TCP层上,就只能对这层起到保护作用。
值得注意的是,能否切实有效地发挥加密机制的作用,关键的问题在于密钥的管理,包括密钥的生存、分发、安装、保管、使用以及作废全过程。
(1)数字签名
公开密钥的加密机制虽提供了良好的保密性,但难以鉴别发送者, 即任何得到公开密钥的人都可以生成和发送报文。数字签名机制提供了一种鉴别方法,以解决伪造、抵赖、冒充和篡改等问题。
数字签名一般采用不对称加密技术(如RSA),通过对整个明文进行某种变换,得到一个值,作为核实签名。接收者使用发送者的公开密钥对签名进行解密运算,如其结果为明文,则签名有效,证明对方的身份是真实的。当然,签名也可以采用多种方式,例如,将签名附在明文之后。数字签名普遍用于银行、电子贸易等。
数字签名不同于手写签字:数字签名随文本的变化而变化,手写签字反映某个人个性特征, 是不变的;数字签名与文本信息是不可分割的,而手写签字是附加在文本之后的,与文本信息是分离的。
(2)Kerberos系统
Kerberos系统是美国麻省理工学院为Athena工程而设计的,为分布式计算环境提供一种对用户双方进行验证的认证方法。
它的安全机制在于首先对发出请求的用户进行身份验证,确认其是否是合法的用户;如是合法的用户,再审核该用户是否有权对他所请求的服务或主机进行访问。从加密算法上来讲,其验证是建立在对称加密的基础上的。
Kerberos系统在分布式计算环境中得到了广泛的应用(如在Notes 中),这是因为它具有如下的特点:
①安全性高,Kerberos系统对用户的口令进行加密后作为用户的私钥,从而避免了用户的口令在网络上显示传输,使得窃听者难以在网络上取得相应的口令信息;
②透明性高,用户在使用过程中,仅在登录时要求输入口令,与平常的操作完全一样,Ker beros的存在对于合法用户来说是透明的;
③可扩展性好,Kerberos为每一个服务提供认证,确保应用的安全。
Kerberos系统和看电影的过程有些相似,不同的是只有事先在Ker beros系统中登录的客户才可以申请服务,并且Kerberos要求申请到入场券的客户就是到TGS(入场券分配服务器)去要求得到最终服务的客户。
Kerberos的认证协议过程如图二所示。
Kerberos有其优点,同时也有其缺点,主要如下:
①、Kerberos服务器与用户共享的秘密是用户的口令字,服务器在回应时不验证用户的真实性,假设只有合法用户拥有口令字。如攻击者记录申请回答报文,就易形成代码本攻击。
②、Kerberos服务器与用户共享的秘密是用户的口令字,服务器在回应时不验证用户的真实性,假设只有合法用户拥有口令字。如攻击者记录申请回答报文,就易形成代码本攻击。
③、AS和TGS是集中式管理,容易形成瓶颈,系统的性能和安全也严重依赖于AS和TGS的性能和安全。在AS和TGS前应该有访问控制,以增强AS和TGS的安全。
④、随用户数增加,密钥管理较复杂。Kerberos拥有每个用户的口令字的散列值,AS与TGS 负责户间通信密钥的分配。当N个用户想同时通信时,仍需要N*(N-1)/2个密钥
( 3 )、PGP算法
PGP(Pretty Good Privacy)是作者hil Zimmermann提出的方案, 从80年代中期开始编写的。公开密钥和分组密钥在同一个系统中,公开密钥采用RSA加密算法,实施对密钥的管理;分组密钥采用了IDEA算法,实施对信息的加密。
PGP应用程序的第一个特点是它的速度快,效率高;另一个显着特点就是它的可移植性出色,它可以在多种操作平台上运行。PGP主要具有加密文件、发送和接收加密的E-mail、数字签名等。
(4)、PEM算法
保密增强邮件(Private Enhanced Mail,PEM),是美国RSA实验室基于RSA和DES算法而开发的产品,其目的是为了增强个人的隐私功能, 目前在Internet网上得到了广泛的应用,专为E-mail用户提供如下两类安全服务:
对所有报文都提供诸如:验证、完整性、防抵 赖等安全服务功能; 提供可选的安全服务功能,如保密性等。
PEM对报文的处理经过如下过程:
第一步,作规范化处理:为了使PEM与MTA(报文传输代理)兼容,按S MTP协议对报文进行规范化处理;
第二步,MIC(Message Integrity Code)计算;
第三步,把处理过的报文转化为适于SMTP系统传输的格式。
身份验证技术
身份识别(Identification)是指定用户向系统出示自己的身份证明过程。身份认证(Authertication)是系统查核用户的身份证明的过程。人们常把这两项工作统称为身份验证(或身份鉴别),是判明和确认通信双方真实身份的两个重要环节。
Web网上采用的安全技术
在Web网上实现网络安全一般有SHTTP/HTTP和SSL两种方式。
(一)、SHTTP/HTTP
SHTTP/HTTP可以采用多种方式对信息进行封装。封装的内容包括加密、签名和基于MAC 的认证。并且一个消息可以被反复封装加密。此外,SHTTP还定义了包头信息来进行密钥传输、认证传输和相似的管理功能。SHTTP可以支持多种加密协议,还为程序员提供了灵活的编程环境。
SHTTP并不依赖于特定的密钥证明系统,它目前支持RSA、带内和带外以及Kerberos密钥交换。
(二)、SSL(安全套层) 安全套接层是一种利用公开密钥技术的工业标准。SSL广泛应用于Intranet和Internet 网,其产品包括由Netscape、Microsoft、IBM 、Open Market等公司提供的支持SSL的客户机和服务器,以及诸如Apa che-SSL等产品。
SSL提供三种基本的安全服务,它们都使用公开密钥技术。
①信息私密,通过使用公开密钥和对称密钥技术以达到信息私密。SSL客户机和SSL服务器之间的所有业务使用在SSL握手过程中建立的密钥和算法进行加密。这样就防止了某些用户通过使用IP packet sniffer工具非法窃听。尽管packet sniffer仍能捕捉到通信的内容, 但却无法破译。 ②信息完整性,确保SSL业务全部达到目的。如果Internet成为可行的电子商业平台,应确保服务器和客户机之间的信息内容免受破坏。SSL利用机密共享和hash函数组提供信息完整性服务。③相互认证,是客户机和服务器相互识别的过程。它们的识别号用公开密钥编码,并在SSL握手时交换各自的识别号。为了验证证明持有者是其合法用户(而不是冒名用户),SSL要求证明持有者在握手时对交换数据进行数字式标识。证明持有者对包括证明的所有信息数据进行标识以说明自己是证明的合法拥有者。这样就防止了其他用户冒名使用证明。证明本身并不提供认证,只有证明和密钥一起才起作用。 ④SSL的安全性服务对终端用户来讲做到尽可能透明。一般情况下,用户只需单击桌面上的一个按钮或联接就可以与SSL的主机相连。与标准的HTTP连接申请不同,一台支持SSL的典型网络主机接受SSL连接的默认端口是443而不是80。
当客户机连接该端口时,首先初始化握手协议,以建立一个SSL对话时段。握手结束后,将对通信加密,并检查信息完整性,直到这个对话时段结束为止。每个SSL对话时段只发生一次握手。相比之下,HTTP 的每一次连接都要执行一次握手,导致通信效率降低。一次SSL握手将发生以下事件:
1.客户机和服务器交换X.509证明以便双方相互确认。这个过程中可以交换全部的证明链,也可以选择只交换一些底层的证明。证明的验证包括:检验有效日期和验证证明的签名权限。
2.客户机随机地产生一组密钥,它们用于信息加密和MAC计算。这些密钥要先通过服务器的公开密钥加密再送往服务器。总共有四个密钥分别用于服务器到客户机以及客户机到服务器的通信。
3.信息加密算法(用于加密)和hash函数(用于确保信息完整性)是综合在一起使用的。Netscape的SSL实现方案是:客户机提供自己支持的所有算法清单,服务器选择它认为最有效的密码。服务器管理者可以使用或禁止某些特定的密码。
代理服务
在 Internet 中广泛采用代理服务工作方式, 如域名系统(DNS), 同时也有许多人把代理服务看成是一种安全性能。
从技术上来讲代理服务(Proxy Service)是一种网关功能,但它的逻辑位置是在OSI 7层协议的应用层之上。
代理(Proxy)使用一个客户程序,与特定的中间结点链接,然后中间结点与期望的服务器进行实际链接。与应用网关型防火墙所不同的是,使用这类防火墙时外部网络与内部网络之间不存在直接连接,因此 ,即使防火墙产生了问题,外部网络也无法与被保护的网络连接。
防火墙技术
(1)防火墙的概念
在计算机领域,把一种能使一个网络及其资源不受网络"墙"外"火灾"影响的设备称为"防火墙"。用更专业一点的话来讲,防火墙(FireW all)就是一个或一组网络设备(计算机系统或路由器等),用来在两个或多个网络间加强访问控制,其目的是保护一个网络不受来自另一个网络的攻击。可以这样理解,相当于在网络周围挖了一条护城河,在唯一的桥上设立了安全哨所,进出的行人都要接受安全检查。
防火墙的组成可以这样表示:防火墙=过滤器+安全策略(+网关)。
(2)防火墙的实现方式
①在边界路由器上实现;
②在一台双端口主机(al-homed host)上实现;
③在公共子网(该子网的作用相当于一台双端口主机)上实现,在此子网上可建立含有停火区结构的防火墙。
(3)防火墙的网络结构
网络的拓扑结构和防火墙的合理配置与防火墙系统的性能密切相关,防火墙一般采用如下几种结构。
①最简单的防火墙结构
这种网络结构能够达到使受保护的网络只能看到"桥头堡主机"( 进出通信必经之主机), 同时,桥头堡主机不转发任何TCP/IP通信包, 网络中的所有服务都必须有桥头堡主机的相应代理服务程序来支持。但它把整个网络的安全性能全部托付于其中的单个安全单元,而单个网络安全单元又是攻击者首选的攻击对象,防火墙一旦破坏,桥头堡主机就变成了一台没有寻径功能的路由器,系统的安全性不可靠。
②单网端防火墙结构
其中屏蔽路由器的作用在于保护堡垒主机(应用网关或代理服务) 的安全而建立起一道屏障。在这种结构中可将堡垒主机看作是信息服务器,它是内部网络对外发布信息的数据中心,但这种网络拓扑结构仍把网络的安全性大部分托付给屏蔽路由器。系统的安全性仍不十分可靠。
③增强型单网段防火墙的结构
为增强网段防火墙安全性,在内部网与子网之间增设一台屏蔽路由器,这样整个子网与内外部网络的联系就各受控于一个工作在网络级的路由器,内部网络与外部网络仍不能直接联系,只能通过相应的路由器与堡垒主机通信。
④含"停火区"的防火墙结构
针对某些安全性特殊需要, 可建立如下的防火墙网络结构。 网络的整个安全特性分担到多个安全单元, 在外停火区的子网上可联接公共信息服务器,作为内外网络进行信息交换的场所。
网络反病毒技术
由于在网络环境下,计算机病毒具有不可估量的威胁性和破坏力, 因此计算机病毒的防范也是网络安全性建设中重要的一环。网络反病毒技术也得到了相应的发展。
网络反病毒技术包括预防病毒、检测病毒和消毒等3种技术。(1) 预防病毒技术,它通过自身常驻系统内存,优先获得系统的控制权,监视和判断系统中是否有病毒存在,进而阻止计算机病毒进入计算机系统和对系统进行破坏。这类技术是:加密可执行程序、引导区保护、系统监控与读写控制(如防病毒卡)等。(2)检测病毒技术,它是通过对计算机病毒的特征来进行判断的技术,如自身校验、关键字、文件长度的变化等。(3)消毒技术,它通过对计算机病毒的分析,开发出具有删除病毒程序并恢复原文件的软件。
网络反病毒技术的实施对象包括文件型病毒、引导型病毒和网络病毒。
网络反病毒技术的具体实现方法包括对网络服务器中的文件进行频繁地扫描和监测;在工作站上采用防病毒芯片和对网络目录及文件设置访问权限等。
随着网上应用不断发展,网络技术不断应用,网络不安全因素将会不断产生,但互为依存的,网络安全技术也会迅速的发展,新的安全技术将会层出不穷,最终Internet网上的安全问题将不会阻挡我们前进的步伐
❹ 网络编程方面的,最好是java的
给软件开发初学者
在论坛上呆久了,发现很大一部分有关开发的帖子都是有关心怀梦想,立志成为一个软件英雄或者响当当的黑客人物;或者是狂热的游戏玩家,突然想迈入游戏开发的殿堂,自己打造一个完美的游戏;或者被以前IT行业的“钱”途无量所吸引,为了经济因素希望成为一个程序员的,而寻求进入软件开发领域之门的求助帖子。
这些诸如“你好,我想做程序员,应该怎么做?”,“初学C++,请问看什么书好”,“请高手帮我看看这个程序”,“我想转行,请高手指点”……的帖子占了各大软件开发论坛帖子总量的很大一部分,而且内容是长年不变,重复来重复去 :P
自从做了epubcn的C++板块的版主,经常收到不相识网友的消息或Email,基本上还是问这些问题。看到这些帖子和Email,不禁想起自己刚刚迈入软件开发的领域,茫茫然不知何去何从,兴奋而又彷徨不安的过去,这样的经历一次又一次,在不同的地点、不同的时间仍然在不断的重复。今天终于坐下来,写下一点文字,希望能够对彷徨的朋友们有点帮助。
确认你真的要迈入软件开发领域
软件开发是一项纯智力活动(现在人们都意识到长时间超负荷的连续写程序并不会提高软件生产率,反而会对软件品质造成很大负面影响,所以尽管很多程序员仍然长时间加班,但这种现象正在逐步减少并最终会消失,所以体力要求并不会比其他行业高),如果你不是一个智力高于平均水平的人,说实话,软件开发并不适合你,你基本不可能在软件开发领域取得很高的成就和地位,而且不久就会因为年龄的增长而被淘汰。
如果你以那些开发出共享软件的软件英雄和着名黑客为榜样,立志也要成为他们的一员,像武侠小说中的大侠一样仗剑江湖。我要先给你泼上大大一盆冷水,把你从幻想拉到现实中来。首先,现在的软件其复杂度和规模都远远超过以前,想一个人独力完成一个规模稍大的软件,基本没有可能(虽然还是有些特例, but trust me,那些仅仅是特例,请不要把自己想象成独一无二的超人、幸运儿);其次,无论是软件英雄还是仗剑江湖的顶尖黑客,他们的软件开发功底和智力都远远超过软件行业从业者的平均水平,没有多年的积累和坚韧超常人的毅力,是不可能,换句话说,想成为他们的一员,可以,但请首先成为一个合格的软件开发人员。
如果你是因为传说中程序员的所谓“高薪”,对自己现在从事的工作不满意,而萌生转行的念头,我劝你还是再慎重考虑一下。程序员的待遇一般来说,是要比平均水平高一些,但远远谈不上高薪,而且以现在程序员的工作量来算,其实同样的付出,程序员所得到的能和平均水平看齐就不错了,程序员的竞争和淘汰也是异常残酷的。技术的更新速度更是其他行业所罕见,每个程序员都要不停的跑步跟上,不使自己落伍,所以在这个层面上来说,没有谁可以停下来休息,唯一能够积累下来的就是你的经验,但经验中能够为你的竞争力增添筹码的并不多。
说了这么多,并不是我故意贬低,而是希望告诉你我所知道的软件开发行业的真实情况,基于此请再慎重考虑你是不是真的要迈入软件开发领域。
检验一下你是否适合当个程序员
在我看来,要做一个合格的程序员,你需要具备下面几个条件:
1. 强烈的好奇心和求知欲
2. 追求完美的精神
3. 良好的逻辑分析能力
其他方面的条件几乎所有类似的帖子都有提及:如果你不是准备单打独斗,那么团队合作能力必不可少;英语我就懒得说了,没有基本的阅读英文资料的能力,我劝你还是打消做个程序员的想法,没有为什么;数学能力也是必不可少的,如果不是做算法,高中水平的数学能力就足够了,但一定要成绩很好才行。
那么为什么我要强调上面列的三点呢?
具有强烈的好奇心和求知欲,能够让你跟上技术发展的步伐,仅仅靠危机感和责任感,你对技术的学习会有很强的功利性质,导致你的技术体系不能构成一个完整自包容的整体,而且很难对技术有高层次的认识和掌握。
我认识的一个资深系统设计师跟我说过:做软件,“做出来”和“做的好”完全是两个概念,所要求的投入和技术水平是天壤之别。现在国内很多程序员仅仅把软件开发当作养家糊口的谋生手段,国内计划经济时代凑合、马马虎虎干活的思想也渗透到了软件业,很多程序员仅仅是把功能做出来,根本不会去考虑提高重用性、可维护性,也不会去考虑提高稳定性、运行速度,甚至连代码也是乱七八糟,基本的编码规范都不遵守(在我看来,这样的人不配“程序员”这个称号),在我们大声谴责国内软件业环境不好,拉项目靠关系,没有质量保证体系,老板不重视程序员,疯狂剥削程序员的时候,我们是不是该问问自己,你是不是只把眼睛盯着别人?
现在各种软件开发包应有尽有,包罗万象,编程工具也异常强大方便,对于国内占主流的MIS系统来说,要完成一个功能实在不是很难的事情,但是如果把系统做为一个整体,则大多数都是运行缓慢、占用资源过大、兼容性差、可维护性差、不稳定的系统,你可曾尝试过开发一个优秀的系统,如果有,你就会发现开发优秀软件是多么困难,对技术的要求是多么高,而你在努力做到完美的过程中水平的提升是多么快。没有追求完美的精神,无论外部环境如何好,你也是不会开发出优秀软件的,等待你的是无休止的修改和维护~,你的技术水平也永远停留在简单的编码阶段,最终只有被迫转行。
好了,我真的适合当个程序员,那我该如何开始?
首先选择一门编程语言和操作系统平台。
操作系统平台国内比较流行的基本有Windows、Linux(Unix)、Mac OS。一般来说大家都选择的是Windows平台,因为此平台是国内处于垄断地位的操作系统,而且有很多优秀的开发工具可供选择,缺点就是Windows 平台的开放性不高,往底层探究比较困难(但我对于言必称底层的观点比较反感,不是所有搞开发的都要对底层非常了解,做出用户满意的系统才是我们追求的根本,玩些底层的trick只是一种自我满足罢了。当然我们需要有一些掌握底层技术的高手,但这个是个人选择的问题),而且用惯Windows的程序员在配置、脚本等方面比较弱。Linux是开源平台,当然从理论上你可以操纵Linux的一切,但是有几个人能够达到这一水平?刚刚开始学习开发的程序员,在 Linux上也仅仅能够开发一些应用软件罢了。Linux下的开发工具不够人性化,但这种情况正在逐步得到缓解,Eclipse就是非常出色的开发平台。在Linux下开发,你可以得到大量优秀的源代码,并且一切都是透明的(只要你想),但你必须学习很多命令行指令,掌握各种系统和参数配置以及脚本方面的知识。
编程语言的选择更是令人头痛,我涉猎不多,对于有些语言,我无法给出任何建议,只好等这方面的高手来给大家补充了。我仅仅对C++和Java进行一些说明,当然这个也仅仅是基于个人体会,绝对不是权威观点 :P
C++仍然是目前占主流的开发语言(详细的可以阅读TCPL中的相关论述),而且一种语言的发展或消亡都是一个渐进的过程,在可以预见的将来,C ++仍然是一门举足轻重的开发语言,但其所针对的领域和方向可能会有所调整,我认为最主要的变化是C++会逐步从商业MIS系统市场上退出。选择C++的理由是关于C++的优秀开发书籍和开发工具最多,相关的资源也异常丰富,待对于一般应用程序的开发掌握之后,无需过渡,就可以深入学习各种技术,因为现阶段讲述系统底层奥秘和高级技术的书籍,基本都是选用C\C++做为示例语言。加上微软精心打造的开发平台Visual Studio或Borland的C++ Builder系列,学习起来更是如虎添翼。但C++现在的缺点也是比较明显的,我最深的感触就是对于XP和Agile Development的支持不好。
Java简化了C++的语法,学习起来比较容易(但随着Java的日益普及和发展,是否能够继续保持这一优势,我不敢断言),Eclipse 是非常优秀的Java开发平台,支持XP的整个过程:设计、测试、编码、重构……现阶段敏捷软件开发的主要语言就是Java。而且Java的跨平台特性更是非常大的优势。
实际上,选择哪门语言都没有关系,根据你的发展规划和目前身边的环境选择就可以,没有必要跟风,其后的坚持才是难点。
好,假设你选择了C++做为开发语言,在Windows平台上开发,那么我给你如下的学习建议(其他的选择请各位积极补充……):
C++语言的学习当然是基础,这个阶段由于没有任何在特定平台上的开发经验,我们只能按照书中的例子一个一个输入运行,暂时告别熟悉的图形界面,回到古老的DOS了。参考书的选择是这个阶段很多朋友关心的,Stan Lippman的《Essential C++》和《C++ Primer》是我优先推荐的,而《Essential C++》因为篇幅较小,讲解内容适当,而且对C++ STL的运用有不少描述,显得相当实用,我认为最适合初学者使用。无论选择了那本书做为入门教材,都应该逐个例子逐个例子的消化,不要贪快,但同时要对重点内容有所侧重。我们学习任何东西都是为了解决实际问题,所以请把重点放在我们实际中最常用的部分,而不要过多的追究一些细节和艰深晦涩的不常用技术。
此刻我们会碰到很多过后看来非常简单幼稚的问题,比如为什么编译出错,为什么按照书中的例子输进去却无法通过编译,找不到头文件等等,大体上这是因为刚刚接触程序开发,对程序理解还很初级,以及对于所使用的开发环境不够了解,特定编译器对标准C++的支持程度不一导致。请多阅读关于所使用开发环境的各种文档,以及查阅帮助文档。以我最经常使用的Visual C++配合MSDN来说,当出现一个我不能理解的编译错误时,按F4键编辑器就会自动跳到当前错误地点,下面的输出窗口也会给出错误代码(比如C××× ×),把错误代码记下,打开MSDN,在索引一栏输入错误代码,就能够查到详细的关于此错误的说明,当然,是英文的(不要问你不会英文怎么办,这是基本要求)。现在的开发工具查错排错非常方便。当然,有时很多错误原因并不是编译器所提示的地方,而是往前或往后一些地方,长期的编程经验可以提高查错速度。此时也请多练习练习Debug技术。
此阶段只要能够掌握C++的基本语言要素,对结构化程序设计和基于对象的设计有一定理解,能够完成一些简单的小程序就可以结束了,毕竟DOS 程序现在很难勾起我们学习的欲望了 :P 在此之后可以视自己的情况决定是否学习数据结构,数据结构是程序员的必修课,不可或缺,地位非常重要,即使你现在希望马上进入图形界面程序开发的世界,这一课我也提醒你记着早点补上。
终于可以迈入图形世界,我们要从SDK编程开始,不要担心,这不会花费你太长时间,但却是对Windows程序运行机制进行深入了解的好时机,在此的努力都不会白费(trust me),此时的参考书没有什么好考虑的,基础的有Charles Petzold的《Windows程序设计》,进阶的有《Windows核心编程》。请从《Windows程序设计》开始,Charles Petzold的书通俗易懂,学习起来非常轻松,而且对你的语言要求不高,只要懂C就可以了。
此时容易碰到的问题大多与项目设置有关,如果使用Visual C++,请按Alt+F7调出项目设置对话框仔细检查,并阅读相关文档,熟悉各项配置的意义。
此阶段请重点掌握Windows SDK程序的编写方法,Windows程序的运行机制和Windows消息机制,和常用的Windows API。我们还可以更进一步:尝试用前一阶段学到的C++知识对过程化的SDK程序进行初步的改造,将我们敲入计算机的程序变得可重用,按照自己对基于对象思想和面向对象思想的理解来重新编写例子程序。
OK,现在你已经初步入门了,掌握了C++的基本用法,对面向对象有了一点模糊而自以为是的认识,也能够写出Windows程序了,虽然还有点简单,还有点丑陋,不过,总归是图形界面啊。开始有点感觉了,是吗? :P 别急着往前冲,停一停,将C++和Windows SDK的基础打牢,贪多嚼不烂吗。此时有很多经典书籍等待你去掌握,也有几乎无限的题材供你练习,请尽量多阅读接触下面的资源:
《C++ Primer》
《Windows核心编程》
《应用程序调试技术》
面向对象开发设计方面的书籍
MSDN的Platform SDK部分,Periodicals部分(包含了大量有价值C++、SDK方面的技术文章)
CodeProject里相关的源代码是很好的补充学习资料
现在继续往前走吧,利用SDK开发毕竟有时太过于费时费力,还是使用更高级的应用程序开发框架的好,主要的有MFC和VCL,关于这些框架谁好谁坏的争论我已经听烦了,一句话,能帮助我们完成任务就行,它们无非都是工具,你自己随便选择吧。不过选择好之后,你应该明白,对于你的工具,了解越深,越能发挥它的威力。如果你选择了MFC,我建议学习下面的书籍:
《深入浅出MFC》:关于此书毋庸多说,尽管有人不停的贬低,但它的地位是无可置疑的,而且也是对我最有帮助的书籍之一。
《MFC程序设计》
《Visual C++技术内幕》
然后就停止找书吧,网上开发站点的数不胜数的源代码就是最好的老师了……
学习过程中碰到问题我该怎么办?
我始终认为学习软件开发过程中遇到的问题只有自己尽最大的努力去解决,才能收到最大的成效,对于那些动不动就把问题发到网上指望高手帮你解决的做法我非常不赞同,因为这样你并不能从中学到多少。我建议的做法是,首先尝试自己独力解决问题,花几个小时解决一个问题,是很正常的,不要几分钟解决不了就放弃了;实在无法解决的时候,请尝试尽量减小涉及范围,将问题归结一下,初步形成自己的结论;然后利用搜索引擎或者开发论坛中的搜索功能来搜索是否有对于自己问题的解答;实在没有的时候,再发帖子求助。请了解一点:你遇到的问题都是别人遇到过的,网上肯定有现成的解决方法(因为你还没有到开发研究前所未有的问题的水平:P),只看你找不找得到了,请尽力去利用现有的资源而不是麻烦别人。
CSDN的论坛、MSDN在线文档都是非常好的资源,基本上我们遇到的问题在这里都能找到解答。
(写的有点乱,大家凑合看吧B))
注:上面的内容还不够全面,非常欢迎各位充实。有什么不对之处,也欢迎大家指出讨论。
❺ 我想学习一下编程的算法,最好是用java写的,因为我现在在学习java,谁的书好推荐下。
个人觉得,写算法的问题,只要真正理解它的原理,用什么语言不重要,也就是说,理解了算法,语言只是它的展现方式和实践应用,算法书网上很多,也可不买,到网上看下核心思想即可,java建议看韩顺平java视频,边看边练习,写的多了,自然有效果了。
❻ 网络与编程中常用的算法与数据结构有哪些
算法就是计算机处理解决问题的计算机能理解的方法。
比如算一个阶乘 , 计算机的算法就是写一个循环,从高到底, 一直乘下去,直到 1 为止。
复杂的算法比如一个强连通带权网络,求两点间的最短路径,这个很有用啊....比如采用广度优先算法,或深度优先算法
数据结构指数据在计算机中存储存在的方式。
比如文件在硬盘中,有二进制,文本等形式存放, 程序中的一组数字可能放在数组里面,也可能在栈里面,也肯能在链表里面
❼ 网络工程专业课方向,密码学好还是算法分析与设计好
根据我这些的开发:建议你选择算法分析与设计
这门课程在软件行业非常非常重要!
当然,如果你的只选修课,那只能按照你的兴趣来选择咯;
但如果出于以后就业考虑,先算法分析与设计绝对没错的!
❽ 算法工程师与游戏研发工程师哪个更有前景,薪水,职业
就目前而言算法工程师普遍待遇更好
我同时做过游戏服务器开发和算法工程师
目前市场上算法工程师很看重学历,好多都是硕士起步。不过我转为算法工程师之后,发现实际上算法工程师应该更看重工程部分,所以要不了那么高的理论。很多算法工程师代码能力不咋地,这点我觉得不管是做普通的开发工程师,还是算法工程师,编程作为基本能力都是应该要考察的。现在算法工程师听起来比较高端,不过其实做过的都知道,一般工作中也不会让你去写一个模型,常用的模型基本上都有现成的开源代码,其实技术含量并没有多高,大部分时间都在调参或者特征工程上面,所以我感觉未来应该算法的门槛会逐渐下降到本科,待遇也会和普通的开发工程师变得差不多
游戏研发的话,我建议就不要去了,中国游戏大环境不行,除非你能去腾讯或者网易这种一线大厂,其它的都很坑,特别是中国的手游公司,做的东西你自己都不想玩,多数时候都是骗投资人的钱
❾ 网络工程和软件开发到底学哪个~~救命!!!
从你的叙述,可以看出你不适合搞软件开发,数学和英语不好,从而一定程度上你的逻辑思维不是很好,那么如果你从事开发的工作,你就会写不出什么好的代码
软件开发和网络工程都是个好的职业,没有难易之分,你的基础不好还是学网络工程,学简单的组网还是比较容易的.就业也是不错的.
❿ 对于社交网络的数据挖掘应该如何入手,使用哪些算法
3月13日下午,南京邮电大学计算机学院、软件学院院长、教授李涛在CIO时代APP微讲座栏目作了题为《大数据时代的数据挖掘》的主题分享,深度诠释了大数据及大数据时代下的数据挖掘。
众所周知,大数据时代的大数据挖掘已成为各行各业的一大热点。
一、数据挖掘
在大数据时代,数据的产生和收集是基础,数据挖掘是关键,数据挖掘可以说是大数据最关键也是最基本的工作。通常而言,数据挖掘也称为DataMining,或知识发现Knowledge Discovery from Data,泛指从大量数据中挖掘出隐含的、先前未知但潜在的有用信息和模式的一个工程化和系统化的过程。
不同的学者对数据挖掘有着不同的理解,但个人认为,数据挖掘的特性主要有以下四个方面:
1.应用性(A Combination of Theory and Application):数据挖掘是理论算法和应用实践的完美结合。数据挖掘源于实际生产生活中应用的需求,挖掘的数据来自于具体应用,同时通过数据挖掘发现的知识又要运用到实践中去,辅助实际决策。所以,数据挖掘来自于应用实践,同时也服务于应用实践,数据是根本,数据挖掘应以数据为导向,其中涉及到算法的设计与开发都需考虑到实际应用的需求,对问题进行抽象和泛化,将好的算法应用于实际中,并在实际中得到检验。
2.工程性(An Engineering Process):数据挖掘是一个由多个步骤组成的工程化过程。数据挖掘的应用特性决定了数据挖掘不仅仅是算法分析和应用,而是一个包含数据准备和管理、数据预处理和转换、挖掘算法开发和应用、结果展示和验证以及知识积累和使用的完整过程。而且在实际应用中,典型的数据挖掘过程还是一个交互和循环的过程。
3.集合性(A Collection of Functionalities):数据挖掘是多种功能的集合。常用的数据挖掘功能包括数据探索分析、关联规则挖掘、时间序列模式挖掘、分类预测、聚类分析、异常检测、数据可视化和链接分析等。一个具体的应用案例往往涉及多个不同的功能。不同的功能通常有不同的理论和技术基础,而且每一个功能都有不同的算法支撑。
4.交叉性(An Interdisciplinary Field):数据挖掘是一门交叉学科,它利用了来自统计分析、模式识别、机器学习、人工智能、信息检索、数据库等诸多不同领域的研究成果和学术思想。同时一些其他领域如随机算法、信息论、可视化、分布式计算和最优化也对数据挖掘的发展起到重要的作用。数据挖掘与这些相关领域的区别可以由前面提到的数据挖掘的3个特性来总结,最重要的是它更侧重于应用。
综上所述,应用性是数据挖掘的一个重要特性,是其区别于其他学科的关键,同时,其应用特性与其他特性相辅相成,这些特性在一定程度上决定了数据挖掘的研究与发展,同时,也为如何学习和掌握数据挖掘提出了指导性意见。如从研究发展来看,实际应用的需求是数据挖掘领域很多方法提出和发展的根源。从最开始的顾客交易数据分析(market basket analysis)、多媒体数据挖掘(multimedia data mining)、隐私保护数据挖掘(privacy-preserving data mining)到文本数据挖掘(text mining)和Web挖掘(Web mining),再到社交媒体挖掘(social media mining)都是由应用推动的。工程性和集合性决定了数据挖掘研究内容和方向的广泛性。其中,工程性使得整个研究过程里的不同步骤都属于数据挖掘的研究范畴。而集合性使得数据挖掘有多种不同的功能,而如何将多种功能联系和结合起来,从一定程度上影响了数据挖掘研究方法的发展。比如,20世纪90年代中期,数据挖掘的研究主要集中在关联规则和时间序列模式的挖掘。到20世纪90年代末,研究人员开始研究基于关联规则和时间序列模式的分类算法(如classification based on association),将两种不同的数据挖掘功能有机地结合起来。21世纪初,一个研究的热点是半监督学习(semi-supervised learning)和半监督聚类(semi-supervised clustering),也是将分类和聚类这两种功能有机结合起来。近年来的一些其他研究方向如子空间聚类(subspace clustering)(特征抽取和聚类的结合)和图分类(graph classification)(图挖掘和分类的结合)也是将多种功能联系和结合在一起。最后,交叉性导致了研究思路和方法设计的多样化。
前面提到的是数据挖掘的特性对研究发展及研究方法的影响,另外,数据挖掘的这些特性对如何学习和掌握数据挖掘提出了指导性的意见,对培养研究生、本科生均有一些指导意见,如应用性在指导数据挖掘时,应熟悉应用的业务和需求,需求才是数据挖掘的目的,业务和算法、技术的紧密结合非常重要,了解业务、把握需求才能有针对性地对数据进行分析,挖掘其价值。因此,在实际应用中需要的是一种既懂业务,又懂数据挖掘算法的人才。工程性决定了要掌握数据挖掘需有一定的工程能力,一个好的数据额挖掘人员首先是一名工程师,有很强大的处理大规模数据和开发原型系统的能力,这相当于在培养数据挖掘工程师时,对数据的处理能力和编程能力很重要。集合性使得在具体应用数据挖掘时,要做好底层不同功能和多种算法积累。交叉性决定了在学习数据挖掘时要主动了解和学习相关领域的思想和技术。
因此,这些特性均是数据挖掘的特点,通过这四个特性可总结和学习数据挖掘。
二、大数据的特征
大数据(bigdata)一词经常被用以描述和指代信息爆炸时代产生的海量信息。研究大数据的意义在于发现和理解信息内容及信息与信息之间的联系。研究大数据首先要理清和了解大数据的特点及基本概念,进而理解和认识大数据。
研究大数据首先要理解大数据的特征和基本概念。业界普遍认为,大数据具有标准的“4V”特征:
1.Volume(大量):数据体量巨大,从TB级别跃升到PB级别。
2.Variety(多样):数据类型繁多,如网络日志、视频、图片、地理位置信息等。
3.Velocity(高速):处理速度快,实时分析,这也是和传统的数据挖掘技术有着本质的不同。
4.Value(价值):价值密度低,蕴含有效价值高,合理利用低密度价值的数据并对其进行正确、准确的分析,将会带来巨大的商业和社会价值。
上述“4V”特点描述了大数据与以往部分抽样的“小数据”的主要区别。然而,实践是大数据的最终价值体现的唯一途径。从实际应用和大数据处理的复杂性看,大数据还具有如下新的“4V”特点:
5.Variability(变化):在不同的场景、不同的研究目标下数据的结构和意义可能会发生变化,因此,在实际研究中要考虑具体的上下文场景(Context)。
6.Veracity(真实性):获取真实、可靠的数据是保证分析结果准确、有效的前提。只有真实而准确的数据才能获取真正有意义的结果。
7.Volatility(波动性)/Variance(差异):由于数据本身含有噪音及分析流程的不规范性,导致采用不同的算法或不同分析过程与手段会得到不稳定的分析结果。
8.Visualization(可视化):在大数据环境下,通过数据可视化可以更加直观地阐释数据的意义,帮助理解数据,解释结果。
综上所述,以上“8V”特征在大数据分析与数据挖掘中具有很强的指导意义。
三、大数据时代下的数据挖掘
在大数据时代,数据挖掘需考虑以下四个问题:
大数据挖掘的核心和本质是应用、算法、数据和平台4个要素的有机结合。
因为数据挖掘是应用驱动的,来源于实践,海量数据产生于应用之中。需用具体的应用数据作为驱动,以算法、工具和平台作为支撑,最终将发现的知识和信息应用到实践中去,从而提供量化的、合理的、可行的、且能产生巨大价值的信息。
挖掘大数据中隐含的有用信息需设计和开发相应的数据挖掘和学习算法。算法的设计和开发需以具体的应用数据作为驱动,同时在实际问题中得到应用和验证,而算法的实现和应用需要高效的处理平台,这个处理平台可以解决波动性问题。高效的处理平台需要有效分析海量数据,及时对多元数据进行集成,同时有力支持数据化对算法及数据可视化的执行,并对数据分析的流程进行规范。
总之,应用、算法、数据、平台这四个方面相结合的思想,是对大数据时代的数据挖掘理解与认识的综合提炼,体现了大数据时代数据挖掘的本质与核心。这四个方面也是对相应研究方面的集成和架构,这四个架构具体从以下四个层面展开:
应用层(Application):关心的是数据的收集与算法验证,关键问题是理解与应用相关的语义和领域知识。
数据层(Data):数据的管理、存储、访问与安全,关心的是如何进行高效的数据使用。
算法层(Algorithm):主要是数据挖掘、机器学习、近似算法等算法的设计与实现。
平台层(Infrastructure):数据的访问和计算,计算平台处理分布式大规模的数据。
综上所述,数据挖掘的算法分为多个层次,在不同的层面有不同的研究内容,可以看到目前在做数据挖掘时的主要研究方向,如利用数据融合技术预处理稀疏、异构、不确定、不完整以及多来源数据;挖掘复杂动态变化的数据;测试通过局部学习和模型融合所得到的全局知识,并反馈相关信息给预处理阶段;对数据并行分布化,达到有效使用的目的。
四、大数据挖掘系统的开发
1.背景目标
大数据时代的来临使得数据的规模和复杂性都出现爆炸式的增长,促使不同应用领域的数据分析人员利用数据挖掘技术对数据进行分析。在应用领域中,如医疗保健、高端制造、金融等,一个典型的数据挖掘任务往往需要复杂的子任务配置,整合多种不同类型的挖掘算法以及在分布式计算环境中高效运行。因此,在大数据时代进行数据挖掘应用的一个当务之急是要开发和建立计算平台和工具,支持应用领域的数据分析人员能够有效地执行数据分析任务。
之前提到一个数据挖掘有多种任务、多种功能及不同的挖掘算法,同时,需要一个高效的平台。因此,大数据时代的数据挖掘和应用的当务之急,便是开发和建立计算平台和工具,支持应用领域的数据分析人员能够有效地执行数据分析任务。
2.相关产品
现有的数据挖掘工具
有Weka、SPSS和SQLServer,它们提供了友好的界面,方便用户进行分析,然而这些工具并不适合进行大规模的数据分析,同时,在使用这些工具时用户很难添加新的算法程序。
流行的数据挖掘算法库
如Mahout、MLC++和MILK,这些算法库提供了大量的数据挖掘算法。但这些算法库需要有高级编程技能才能进行任务配置和算法集成。
最近出现的一些集成的数据挖掘产品
如Radoop和BC-PDM,它们提供友好的用户界面来快速配置数据挖掘任务。但这些产品是基于Hadoop框架的,对非Hadoop算法程序的支持非常有限。没有明确地解决在多用户和多任务情况下的资源分配。
3.FIU-Miner
为解决现有工具和产品在大数据挖掘中的局限性,我们团队开发了一个新的平台——FIU-Miner,它代表了A Fast,Integrated,and User-Friendly System for Data Miningin Distributed Environment。它是一个用户友好并支持在分布式环境中进行高效率计算和快速集成的数据挖掘系统。与现有数据挖掘平台相比,FIU-Miner提供了一组新的功能,能够帮助数据分析人员方便并有效地开展各项复杂的数据挖掘任务。
与传统的数据挖掘平台相比,它提供了一些新的功能,主要有以下几个方面:
A.用户友好、人性化、快速的数据挖掘任务配置。基于“软件即服务”这一模式,FIU-Miner隐藏了与数据分析任务无关的低端细节。通过FIU-Miner提供的人性化用户界面,用户可以通过将现有算法直接组装成工作流,轻松完成一个复杂数据挖掘问题的任务配置,而不需要编写任何代码。
B.灵活的多语言程序集成。允许用户将目前最先进的数据挖掘算法直接导入系统算法库中,以此对分析工具集合进行扩充和管理。同时,由于FIU-Miner能够正确地将任务分配到有合适运行环境的计算节点上,所以对这些导入的算法没有实现语言的限制。
C.异构环境中有效的资源管理。FIU-Miner支持在异构的计算环境中(包括图形工作站、单个计算机、和服务器等)运行数据挖掘任务。FIU-Miner综合考虑各种因素(包括算法实现、服务器负载平衡和数据位置)来优化计算资源的利用率。
D.有效的程序调度和执行。
应用架构上包括用户界面层、任务和系统管理层、逻辑资源层、异构的物理资源层。这种分层架构充分考虑了海量数据的分布式存储、不同数据挖掘算法的集成、多重任务的配置及系统用户的交付功能。一个典型的数据挖掘任务在应用之中需要复杂的主任务配置,整合多种不同类型的挖掘算法。因此,开发和建立这样的计算平台和工具,支持应用领域的数据分析人员进行有效的分析是大数据挖掘中的一个重要任务。
FIU-Miner系统用在了不同方面:如高端制造业、仓库智能管理、空间数据处理等,TerraFly GeoCloud是建立在TerraFly系统之上的、支持多种在线空间数据分析的一个平台。提供了一种类SQL语句的空间数据查询与挖掘语言MapQL。它不但支持类SQL语句,更重要的是可根据用户的不同要求,进行空间数据挖掘,渲染和画图查询得到空间数据。通过构建空间数据分析的工作流来优化分析流程,提高分析效率。
制造业是指大规模地把原材料加工成成品的工业生产过程。高端制造业是指制造业中新出现的具有高技术含量、高附加值、强竞争力的产业。典型的高端制造业包括电子半导体生产、精密仪器制造、生物制药等。这些制造领域往往涉及严密的工程设计、复杂的装配生产线、大量的控制加工设备与工艺参数、精确的过程控制和材料的严格规范。产量和品质极大地依赖流程管控和优化决策。因此,制造企业不遗余力地采用各种措施优化生产流程、调优控制参数、提高产品品质和产量,从而提高企业的竞争力。
在空间数据处理方面,TerraFly GeoCloud对多种在线空间数据分析。对传统数据分析而言,其难点在于MapQL语句比较难写,任务之间的关系比较复杂,顺序执行之间空间数据分许效率较低。而FIU-Miner可有效解决以上三个难点。
总结而言,大数据的复杂特征对数据挖掘在理论和算法研究方面提出了新的要求和挑战。大数据是现象,核心是挖掘数据中蕴含的潜在信息,并使它们发挥价值。数据挖掘是理论技术和实际应用的完美结合。数据挖掘是理论和实践相结合的一个例子。
-
-