??xml version="1.0" encoding="utf-8" standalone="yes"?>性欧美大战久久久久久久久,久久综合综合久久97色,国产精品一久久香蕉国产线看观看http://www.shnenglu.com/Onway/category/12318.html菜鸟U?/description>zh-cnFri, 02 Sep 2011 01:00:02 GMTFri, 02 Sep 2011 01:00:02 GMT60ZX的GNOME、GTK、GDK、XLib、GLib{之间的关系(?http://www.shnenglu.com/Onway/articles/154198.htmlOnwayOnwayWed, 24 Aug 2011 02:26:00 GMThttp://www.shnenglu.com/Onway/articles/154198.htmlhttp://www.shnenglu.com/Onway/comments/154198.htmlhttp://www.shnenglu.com/Onway/articles/154198.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/154198.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/154198.html
ZX的GNOME、GTK、GDK、XLib、GLib{之间的关系
(转自http://blog.chinaunix.net/space.php?uid=20334226&do=blog&id=1965083)
什么是Xlib?
The X Library是X WindowE式最低阶的APIQ如果拿来和Windows比较hQXlib和Windows APIs(或称Windows SDK)一P是最接近X Server的程序设计介面,它只提供最基本的绘囑֒讯息事g的处理?/div>
什么是Xt?(X Toolkit Intrinsics) 
Xt是第一个把Xlib包装成更抽象化的函式库,它提供了「物件导向」的E式设计架构Qƈ且引q了一U称为「widget」的概念Q这U「widget」资料结构也是所谓的「User Interface Componets」像是menus、buttons或是TextBox{widgets?从此以后E式设计师就可以用widget的观念,来架构我们的应用E式Q让E式变得单且Ҏ(gu)了解?nbsp;
不过Xt只定义了应用E式要如何和q些widgets沟通,q没有规定这些widgets的外观要长什么模栗?q些widgets真正的样子最后还是得靠更高层的函式库来处理?(通常提供widgets的函式库Q我们就UC为GUI ToolkitQX ToolKits)?nbsp;
Motif、OpenLook和Lesstif{便都是从Xt Library衍生而来的图形介面函式库
Motif 
Motif为目前最主要的GUI ToolkitQ它便是以Xt的widget概念为基Q提供外观和Microsoft Windows 95极ؓcM的图形介面?Motif是由O(jin)pen Group (以前叫Open Software Foundation)所Z?nbsp;
不过现在的Motif已经不只是单U的GUI Toolkit了,它也包含了一个Motif window manager(H口理?用来理X Clients (X Applications)?/div>
 
什么是GDK? 
GDK是标准Xlib函数调用的一个基本封?wrapper),如果你对Xlib很熟(zhn)?׃需要来重新熟?zhn)l大多数的GDK函数.所有的函数都是Z提供一 个方便直观的风格来访问Xlib函数?另外,自从GDK使用GLib,在多q_上用时,GDK变得更加的方便和安全. 
什么是GLib? 
GLib库提供了一pd函数(functions)和定?definitions),在设计GDK和GTKE序时很有用.它提供了一些标准c函数?stan dard libc)的替代函?比如malloc,但在其他的系l上使用时有很多问题. 
什么是GTK+? 
GTK+是一个小型而高效的控g?hMotif的外观和风格.实际?它比Motif看v来好多了,它包含有基本的控件和一些很复杂的的控g:例如文g选择、控件和颜色选择控g. GTK+提供了一些独特的Ҏ(gu)?(臛_,我知道其他的控g库不提供他们),例如,按钮不提供标{?它包含了一个子控g,在很多的时候是一个标{?但是,q个子控件也可以是一个映?囑փ或者Q何其他的E序员想要的集合.在整个的库中,你随处可见这U׾~? 
Gnome的开发基l构是围l一l函数库的,所有的内容都是用可UL的ANSI C语言写成的,可以用于所有类UNIXpȝQ与囑Ş相关的函数库依赖于X Windowpȝ?Gnome函数库是最高层的?GTKQ由两部分组成,GTK和GDK?GTK层ؓC语言提供了一个对象模型,qؓUI工具包提供了最基本的widgetQ它是上层GUIz的基?GTK是依赖于GDK的,GDK是Xlib的一个底层包装,Xlib库直接与X服务器对话?除了​​Xlib以外的Q何部分都是基于GLib的,它是一个有用的C函数库,提供了很多实用程序和可移植的功能以及一l容易被C语言使用的容器?nbsp;
一个GnomeE序是用多个库l成的层ơ结构:
GNOME (GNU Network Object Model Environment)是以GTK为基的图形介面函式库?和KDE一PGNOME也是以徏立一个完整、友善的囑Ş使用环境为目标,q提供GNOME相关的Y体?nbsp;
Gnome库在最高层Q包括帮助例E,cdҎ(gu)的widgetQƈ为应用程序提供一个基架构?nbsp;
W二层是GTKQ它是GTKQ库的一部分?q个库提供了基本的工具包和widget来创建GUI应用E序?大多数GUI是直接用GTK~写的?GTK同时为Gnome库提供了一个功能强大的对象pȝ?nbsp;
再下一层是GDKQ它单的对X函数库进行了包装Q只有在我们q行Ҏ(gu)l画或设|窗口的Ҏ(gu)属性的时候才会用到它. 
最下面一层是GlibQ它是C的一个实用程序库Q包括可UL性和一些实用程序功能,以及一些容器类Q例如:链表Q可变数l,变长字符ԌHASH西表Q,~存Q一个事件@环和其他有用的结构?nbsp;


Onway 2011-08-24 10:26 发表评论
]]>安装GTK+(?http://www.shnenglu.com/Onway/articles/154197.htmlOnwayOnwayWed, 24 Aug 2011 02:24:00 GMThttp://www.shnenglu.com/Onway/articles/154197.htmlhttp://www.shnenglu.com/Onway/comments/154197.htmlhttp://www.shnenglu.com/Onway/articles/154197.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/154197.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/154197.html
Ubuntu下GTK的安?/div>
(转自http://www.linuxidc.com/Linux/2008-09/15955.htm)
apt-get install build-essential #q将安装gcc/g++/gdb/make {基本编E工?/div>
apt-get install gnome-core-devel #q将安装 libgtk2.0-dev libglib2.0-dev {开发相关的库文?/div>
apt-get install pkg-config #用于在编译GTKE序时自动找出头文g及库文g位置
apt-get install devhelp #q将安装 devhelp GTK文查看E序
apt-get install libglib2.0-doc libgtk2.0-doc #q将安装 gtk/glib 的API参考手册及其它帮助文
apt-get install glade libglade2-dev #q将安装ZGTK的界面GTK是开发GnomeH口的c/c++语言囑Ş库?/div>
apt-get install libgtk2.0*, gtk+2.0所需的所有文件统通下载安装完毕?/div>
应用E序~译命oQgcc test.c `pkg-config --cflags --libs gtk+-2.0`Q编译通过Q运行正常?/div>
pkg-config是一个用来管理包的程序,在控制台输入 pkg-config --cflags --libs gtk+-2.0Q可以发现输出的文本包括了gcc~译gtk+2.0所需要的所有选项Q头文g目录和库文gQ?/div>
q里有一炚w要注意, gcc test.c `pkg-config --cflags --libs gtk+-2.0`, pkg-config --cflags --libs gtk+-2.0两侧的引号ƈ不是真正的引P而是键盘数字仉一行,最左边的那个字W。如果错用了单引Pgcc无法使用 pkg-config --cflags --libs gtk+-2.0产生的文本作为编译选项。构造程序?br />

[Linux]安装GTK全攻?自己走过的弯路不希望别h再走)
(转自http://blogger.org.cn/blog/more.asp?name=airclh&id=27104)
一?       所需的源码包
1. GNU make 工具
2. GNU gettext 软g包(当系l上没有 gettext() 函数的时候需要)
3. GNU libiconv 库(当系l上没有 iconv() 函数的时候需要)
4. fontconfig?/div>
fontconfig 是提供系l范围内字体讄Q定制和允许应用E序讉K的函数库?/div>
5. FreeType?/div>
GTK+(ZDirectFB)的字体绘制是通过pango+freetype+fontconfig三者协作来完成的,其中Qfontconfig负责字体的管理和配置Qfreetype负责单个字符的绘Ӟpango则完成对文字的排版布局。Freetype是一个操作字体的函数库,它不但可以处理点阵字体,也可以处理多U矢量字体,包括truetype字体Qؓ上层应用E序提供了一个统一的调用接口?/div>
6. libpng?/div>
libpng软g包包?libpng 库,q些库被其他E序用于dpng文g。PNG 库是用来创立和操作PNG 格式的图形文?PNG 格式是设计来替代GIF,它对于更范围的TIFF(标记图象文g格式)来说, 有了很多的进步和拓展q且减少了关于专利权的麻?
7. jpegsrc?/div>
能够使用JPEG法压羃文g?/div>
8. tiff?/div>
tiff库被很多E序用于dtiff文g?/div>
9.pkg-config 工具
pkgconfig 包括 pkg-config E序Q用来在~译脚本中向~译器传递头文g包含路径或库文g路径?/div>
对于支持 pkg-config 工具?GTK+ 及其依赖库来_库的头文件的搜烦路径的设|变成了?.pc 文g搜烦路径的设|?pc 文g的搜索\径是通过环境变量 PKG_CONFIG_PATH 来设|的Qpkg-config 按照设|\径的先后序q行搜烦Q直到找到指定的 .pc 文g为止?/div>
10. GLib ?/div>
GLib是GTK+和GNOME工程的基底层核心E序库,创徏 GDK ?GTK 应用E序时该库可提供许多有用的定义和函数Q是一个综合用途的实用的轻量的CE序库,它提供C语言的常用的数据l构的定义、相关的处理函数Q有而实用的宏,可移植的装和一些运行时Q如事g循环、线E、动态调用、对象系l等的API?/div>
11. ATK ?/div>
ATK 包包含了 ATK 库。ATK是可讉K性工LQAccessibility ToolkitQ的U。ATK 为所有的GTK2E序提供了解?Accessibility 需求的框架?/div>
12. Cairo ?/div>
CairoQ是一个跨q_的开放源代码的矢量图形函数库Q可以提供高质量的显C和打印输出。Cairo提供一个稳定的用户层APIQ它可以提供C化的囑Ş处理理能力Q如l制和填充,映射转换Q合成(注意Q是合成Q与改变alpha半透明囑փQ高真文本显C等{。能够在不同的媒体上实现相同的输出?/div>
13. Pango ?/div>
Pango 库提供了底层的文本编排绘制生成函? 一套生成整D|本布局的高层函数和帮助~辑多国文本的函数?/div>
14. GTK+ ?/div>
 
 
其中前五一般比较新的Linux版本中,pȝ都会自带。需要注意的一个问题是如果GTK的安装\径ؓ/opt/gtkӞ在PKG_CONFIG_PATH中除了要d/opt/gtk/lib/pkgconfig之外Q还有加?usr/lib/pkgconfig。因为安装在pȝ的库?pc文g都在/usr/lib/pkgconfig中,惌在安装GTK时用到这些系l自带的库时Q必L路径讄清楚?/div>
在收集安装GTK所需的源码包时最重要Q也是最Ҏ(gu)忽略的一个问题就是各个包之间版本的匹配问题。我在安装GTK忽略了q个问题Q结果走了很多弯路。解册个问题最单的办法是登陆GTK+ 的网?:ftp://ftp.gtk.org/pub/gtkQ在上面下蝲各种源码包。在q个站点上,每个GTK版本兼容的源码包都放在一个文件夹下。例如我选择安装GTK v2.6Q只要在ftp://ftp.gtk.org/pub/gtk/v2.6中下载各个包卛_。不q选择V2.6的朋友要严重注意一个问题,支持GTK V2.6的pango包有两个版本Q?.8.0?.8.1Q?.8.0是一个失败的版本Q如果选择它,在安装GTK时就会死zL不到pango库。我当时是q个版本的受完,׃很长旉也无法在安装GTK时连接pango库,后来在网上看C个老外说这个版本有bugQ只能?.8.1版本。妈的!q不坑h吗!
Ҏ(gu)依赖关系的要求,库的安装要按照这L先后序q行QGLib、Atk、Cairo、Pango、Gtk+?/div>
二?       讄
主要包括对LD_LIBRARY_PATH和PKG_CONFIG_PATH的设|,具体如下Q?/div>
> export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
> export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
注意Q如果想要用系l中已有的fontconfig、FreeType{库Q需要加上系l原有的库:
> export LD_LIBRARY_PATH=/usr/lib
> export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
> export PKG_CONFIG_PATH=/usr/lib/pkgconfig
> export PKG_CONFIG_PATH=/usr/X11R6 /lib/pkgconfig:$PKG_CONFIG_PATH
> export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH
Ҏ(gu)被h忽略的一Ҏ(gu)LD_LIBRARY_PATH和PKG_CONFIG_PATHq两个环境变量只对当前的l端H口有效。如果到了没有进行上q设|的l端H口中,pkg-config 找不到新安装库?pc 文g、从而可能后面q行的安装无法进行?自己犯的一个简单却造成严重后果的错误,吐血提醒大家?
三?       源码包的安装
我安装的GTK版本为v2.6Q用到的源码包包括:jpegsrc.v6b.tar.gz、libpng-1.2.8.tar.bz2、tiff-v3.6.1.tar.gz、pkgconfig-0.15.0.tar.gz、glib-2.6.6.tar.bz2、atk-1.9.0.tar.bz2、cairo-1.2.4.tar.gz、pango-1.8.1.tar.bz2、gtk+-2.6.9.tar.bz2。把它们都放在root的主目录下?/div>
?GTK+ 及其依赖库设|安装到同一个目?opt/gtk下、而不是每一个库占用一个不同的目录Q可以给以后的库的设|带来方ѝ而且Q在来不再需要这个版本的 GTK+ 及其依赖库的时候可以通过删除q个目录它们简单地去除?/div>
1Q?            安装pkgconfig
> tar zxvf pkgconfig-0.15.0.tar.gz
> cd /root/pkgconfig-0.15.0
> ./configure
> make
> make install
 
每个q程l束后,都可以用?echo $? 查是否执行安装成功。如果输出是 0Q说明配|成功;0 之外的数字说明配|失败。在 Linux pȝ上,可以用这个方法检查一个命令或E序在其l束后返回给pȝ的值是多少。一?0 代表成功Q非 0 表示E序异常退出?/div>
2Q安装glib
> tar zjvf glib-2.6.6.tar.bz2
> cd /root/ glib-2.6.6
>./configure --prefix=/opt/gtk
>make
>make install
3Q安装atk
> tar zjvf atk-1.9.0.tar.bz2
> cd /root/ atk-1.9.0
>./configure --prefix=/opt/gtk
>make
>make install
4.安装cairo
> tar zxvf cairo-1.2.4.tar.gz
> cd /root/ cairo-1.2.4
>./configure --prefix=/opt/gtk --with-x --enable-win32=no
>make
>make install
5.安装Pango
> tar zxvf cairo-1.2.4.tar.gz
> cd /root/ cairo-1.2.4
>./configure --prefix=/opt/gtk --libdir=/opt/gtk/lib --with-x
>make
>make install
6Q安装libpng
> tar zjvf libpng-1.2.8.tar.bz2
> cd /root/ libpng-1.2.8
> make prefix=/opt/gtk \ZLIBINC=/opt/gtk/include ZLIBLIB=/opt/gtk/lib -f scripts/makefile.linux
>make prefix=/opt/gtk install -f scripts/makefile.linux
7Q安装libtiff(是tiff)
> tar zxvf tiff-v3.6.1.tar.gz
> cd /root/ tiff-v3.6.1
> ./configure --prefix=/opt/gtk --noninteractive \ --with-DIR_MAN=/opt/gtk/share/man
> make
> make install
8Q安装libjpeg(是jpegsrv)
> tar zxvf jpegsrc.v6b.tar.gz
> cd /root/jpeg-6b
> ./configure --enable-static --enable-shared --prefix=/opt/gtk
> make
> make install
注:jpeg默认不share libraryQ因此要手工指定--enable-sharedQ一般安装lib时这一炚w是要注意的?/div>
10Q安装gtk
> tar zjvf gtk+-2.6.9.tar.bz2
> cd /root/ gtk+-2.6.9
> ./configure --prefix=/opt/gtk --with-x --without-libjpeg
> make
> make install
四?       验是否正安装GTK
Z验是否正安装GTKQ利用GTK~写一个简单的E序Q这个程序创?200x200 大小的窗口。源码如下:
#include <gtk/gtk.h>
int main( int argc,
char *argv[] )
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
?gcc ~译上面的程序:
gcc base.c –o base `pkg-config –cflags –libs gtk+2.0`
成功~译后,使用命o./baseq行该程序?/div>
注意上面~译命o中用的单引L型是很重要的?译者注Q这里用了“命o替换”。命令替?command substitution)使得可以捕获一个命令的输出而在另一个命令中替换它。这个单引号不是回R键左边的那个Q而是ESC键下面的那个? 


Onway 2011-08-24 10:24 发表评论
]]>DD牛的背包?ji)?/title><link>http://www.shnenglu.com/Onway/articles/137617.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Tue, 28 Dec 2010 11:07:00 GMT</pubDate><guid>http://www.shnenglu.com/Onway/articles/137617.html</guid><wfw:comment>http://www.shnenglu.com/Onway/comments/137617.html</wfw:comment><comments>http://www.shnenglu.com/Onway/articles/137617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Onway/comments/commentRss/137617.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Onway/services/trackbacks/137617.html</trackback:ping><description><![CDATA[出处不详?br><br> <div id="lvvhzpj" class=postbody><font color=#000000 size=3 face=宋体>P01: 01背包问题 <br>题目 <br>有N件物品和一个容量ؓV的背包。第i件物品的费用是c[i]Qh(hun)值是w[i]。求解将哪些物品装入背包可ɘq些物品的费用d不超q背包容量,且h(hun)值d最大?<br><br>基本思\ <br>q是最基础的背包问题,特点是:每种物品仅有一Ӟ可以选择放或不放?<br><br>用子问题定义状态:即f[i][v]表示前i件物品恰攑օ一个容量ؓv的背包可以获得的最大h(hun)倹{则其状态{ULE便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}?<br><br>q个方程非常重要Q基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要它详细解释一下:“前i件物品放入容量ؓv的背包中”q个子问题,若只考虑Wi件物品的{略Q放或不放)Q那么就可以转化Z个只牉|前i-1件物品的问题。如果不攄i件物品,那么问题p{化ؓ“前i-1件物品放入容量ؓv的背包中”Q如果放Wi件物品,那么问题p{化ؓ“前i-1件物品放入剩下的定w为v-c[i]的背包中”Q此时能获得的最大h(hun)值就是f [i-1][v-c[i]]再加上通过攑օWi件物品获得的价值w[i]?<br><br>注意f[i][v]有意义当且仅当存在一个前i件物品的子集Q其费用d为v。所以按照这个方E递推完毕后,最l的{案q不一定是f[N] [V]Q而是f[N][0..V]的最大倹{如果将状态的定义中的“?#8221;字去掉,在{ULE中p再加入一f[i][v-1]Q这样就可以保证f[N] [V]是最后的{案。至于ؓ什么这样就可以Q由你自己来体会了?<br><br>优化I间复杂?<br>以上Ҏ(gu)的时间和I间复杂度均为O(N*V)Q其中时间复杂度基本已经不能再优化了Q但I间复杂度却可以优化到O(V)?<br><br>先考虑上面讲的基本思\如何实现Q肯定是有一个主循环i=1..NQ每ơ算出来二维数组f[i][0..V]的所有倹{那么,如果只用一个数lf [0..V]Q能不能保证Wiơ@环结束后f[v]中表C的是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1] [v-c[i]]两个子问题递推而来Q能否保证在推f[i][v]Ӟ也即在第iơ主循环中推f[v]Ӟ能够得到f[i-1][v]和f[i-1][v -c[i]]的值呢Q事实上Q这要求在每ơ主循环中我们以v=V..0的顺序推f[v]Q这h能保证推f[v]时f[v-c[i]]保存的是状态f[i -1][v-c[i]]的倹{伪代码如下Q?<br><br>for i=1..N <br>for v=V..0 <br>f[v]=max{f[v],f[v-c[i]]+w[i]}; <br><br>其中的f[v]=max{f[v],f[v-c[i]]}一句恰q当于我们的{ULEf[i][v]=max{f[i-1][v],f[i- 1][v-c[i]]}Q因为现在的f[v-c[i]]q当于原来的f[i-1][v-c[i]]。如果将v的@环顺序从上面的逆序Ҏ(gu)序的话Q那么则成了f[i][v]由f[i][v-c[i]]推知Q与本题意不W,但它却是另一个重要的背包问题P02最L解决Ҏ(gu)Q故学习只用一l数l解01背包问题是十分必要的?<br><br>ȝ <br>01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方E的最基本思想Q另外,别的cd的背包问题往往也可以{换成01背包问题求解。故一定要仔细体会上面基本思\的得出方法,状态{ULE的意义Q以及最后怎样优化的空间复杂度?<br><br>P02: 完全背包问题 <br>题目 <br>有NU物品和一个容量ؓV的背包,每种物品都有无限件可用。第iU物品的费用是c[i]Qh(hun)值是w[i]。求解将哪些物品装入背包可ɘq些物品的费用d不超q背包容量,且h(hun)值d最大?<br><br>基本思\ <br>q个问题非常cM?1背包问题Q所不同的是每种物品有无限g。也是从每U物品的角度考虑Q与它相关的{略已ƈ非取或不取两U,而是有取0件、取1件、取2?#8230;…{很多种。如果仍然按照解01背包时的思\Qof[i][v]表示前iU物品恰攑օ一个容量ؓv的背包的最大权倹{仍然可以按照每U物品不同的{略写出状态{ULE,像这Pf[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<= v}。这?1背包问题一hO(N*V)个状态需要求解,但求解每个状态的旉则不是常CQ求解状态f[i][v]的时间是O(v/c[i])Qȝ复杂度是过O(VN)的?<br><br>?1背包问题的基本思\加以改进Q得Cq样一个清晰的Ҏ(gu)。这说明01背包问题的方E的是很重要,可以推及其它cd的背包问题。但我们q是试图改进q个复杂度?<br><br>一个简单有效的优化 <br>完全背包问题有一个很单有效的优化Q是q样的:若两件物品i、j满c[i]<=c[j]且w[i]>=w[j]Q则物品jLQ不用考虑。这个优化的正确性显ӞM情况下都可将价值小费用高得j换成物美价廉的iQ得到至不会更差的Ҏ(gu)。对于随机生成的数据Q这个方法往往会大大减物品的件数Q从而加快速度。然而这个ƈ不能改善最坏情늚复杂度,因ؓ有可能特别设计的数据可以一件物品也M掉?<br><br>转化?1背包问题求解 <br>既然01背包问题是最基本的背包问题,那么我们可以考虑把完全背包问题{化ؓ01背包问题来解。最单的x是,考虑到第iU物品最多选V/c [i]Ӟ于是可以把第iU物品{化ؓV/c[i]件费用及价值均不变的物品,然后求解q个01背包问题。这样完全没有改q基本思\的时间复杂度Q但q毕竟给了我们将完全背包问题转化?1背包问题的思\Q将一U物品拆成多件物品?<br><br>更高效的转化Ҏ(gu)是:把第iU物品拆成费用ؓc[i]*2^k、h(hun)gؓw[i]*2^k的若qg物品Q其中k满c[i]*2^k<V。这是二q制的思想Q因Z最优策略选几件第iU物品,d以表C成若干?^k件物品的和。这h每种物品拆成O(log(V/c[i]))件物品,是一个很大的改进?但我们有更优的O(VN)的算法?* O(VN)的算?q个法使用一l数l,先看伪代码: <pre class"example"> for i=1..N for v=0..V f[v]=max{f[v],f[v-c[i]]+w[i]}; <br><br><br><br>你会发现Q这个伪代码与P01的伪代码只有v的@环次序不同而已。ؓ什么这样一改就可行呢?首先xZ么P01中要按照v=V..0的逆序来@环。这是因保证Wiơ@环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来。换句话_q正是ؓ了保证每件物品只选一ơ,保证在考虑“选入Wi件物?#8221;qg{略Ӟ依据的是一个绝无已l选入Wi件物品的子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限gQ所以在考虑“加选一件第iU物?#8221;q种{略Ӟ却正需要一个可能已选入WiU物品的子结果f[i][v-c[i]]Q所以就可以q且必须采用v= 0..V的顺序@环。这是q个单的E序Z成立的道理?<br><br>q个法也可以以另外的思\得出。例如,基本思\中的状态{ULE可以等价地变Ş成这UŞ式:f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}Q将q个方程用一l数l实玎ͼ便得C上面的伪代码?<br><br>ȝ <br>完全背包问题也是一个相当基的背包问题,它有两个状态{ULE,分别?#8220;基本思\”以及“O(VN)的算?#8220;的小节中l出。希望你能够对这两个状态{ULE都仔细C会,不仅CQ也要弄明白它们是怎么得出来的Q最好能够自己想一U得到这些方E的Ҏ(gu)。事实上Q对每一道动态规划题目都思考其方程的意义以及如何得来,是加深对动态规划的理解、提高动态规划功力的好方法?<br><br>P03: 多重背包问题 <br>题目 <br>有NU物品和一个容量ؓV的背包。第iU物品最多有n[i]件可用,每g费用是c[i]Qh(hun)值是w[i]。求解将哪些物品装入背包可ɘq些物品的费用d不超q背包容量,且h(hun)值d最大?<br><br>基本法 <br>q题目和完全背包问题很类伹{基本的方程只需完全背包问题的方程略微一改即可,因ؓ对于WiU物品有n[i]+1U策略:?Ӟ??#8230;…?n[i]件。of[i][v]表示前iU物品恰攑օ一个容量ؓv的背包的最大权|则:f[i][v]=max{f[i-1][v-k*c[i]]+ k*w[i]|0<=k<=n[i]}。复杂度是O(V*∑n[i])?<br><br>转化?1背包问题 <br>另一U好惛_写的基本Ҏ(gu)是{化ؓ01背包求解Q把WiU物品换成n[i]?1背包中的物品Q则得到了物品数为∑n[i]?1背包问题Q直接求解,复杂度仍然是O(V*∑n[i])?<br><br>但是我们期望它转化?1背包问题之后能够像完全背包一样降低复杂度。仍然考虑二进制的思想Q我们考虑把第iU物品换成若qg物品Q得原问题中第iU物品可取的每种{略——取0..n[i]件——均能等价于取若qg代换以后的物品。另外,取超qn[i]件的{略必不能出现?<br><br>Ҏ(gu)是:第iU物品分成若qg物品Q其中每件物品有一个系敎ͼqg物品的费用和价值均是原来的费用和h(hun)g以这个系数。ɘq些pL分别?1,2,4,...,2^(k-1),n[i]-2^k+1Q且k是满n[i]-2^k+1>0的最大整数。例如,如果n[i]?3Q就这U物品分成系数分别ؓ1,2,4,6的四件物品?<br><br>分成的这几g物品的系数和为n[i]Q表明不可能取多于n[i]件的WiU物品。另外这U方法也能保证对?..n[i]间的每一个整敎ͼ均可以用若干个系数的和表C,q个证明可以?..2^k-1?^k..n[i]两段来分别讨论得出,q不难,希望你自己思考尝试一下?<br><br>q样将WiU物品分成了O(log n[i])U物品,原问题转化Z复杂度ؓO(V*∑log n[i])?1背包问题Q是很大的改q?<br><br>O(VN)的算?<br>多重背包问题同样有O(VN)的算法。这个算法基于基本算法的状态{ULE,但应用单调队列的Ҏ(gu)使每个状态的值可以以均摊O(1)的时间求解。由于用单调队列优化的DP已超ZNOIP的范_故本文不再展开讲解。我最初了解到q个Ҏ(gu)是在楼天成的“男h八题”qȝ片上?<br><br>结 <br>q里我们看到了将一个算法的复杂度由O(jin)(V*∑n[i])改进到O(V*∑log n[i])的过E,q知道了存在应用出NOIP范围的知识的O(VN)法。希望你特别注意“拆分物品”的思想和方法,自己证明一下它的正性,q用量z的E序来实现?<br><br><br><br>P04: 混合三种背包问题 <br>问题 <br>如果P01、P02、P03混合h。也是_有的物品只可以取一ơ(01背包Q,有的物品可以取无限次Q完全背包)Q有的物品可以取的次数有一个上限(多重背包Q。应该怎么求解呢? <br><br>01背包与完全背包的混合 <br>考虑到在P01和P02中最后给出的伪代码只有一处不同,故如果只有两cȝ品:一cȝ品只能取一ơ,另一cȝ品可以取无限ơ,那么只需在对每个物品应用转移方程ӞҎ(gu)物品的类别选用序或逆序的@环即可,复杂度是O(VN)。伪代码如下Q?<br><br>for i=1..N <br>if Wi件物品是01背包 <br>for v=V..0 <br>f[v]=max{f[v],f[v-c[i]]+w[i]}; <br>else if Wi件物品是完全背包 <br>for v=0..V <br>f[v]=max{f[v],f[v-c[i]]+w[i]}; <br><br>再加上多重背?<br>如果再加上有的物品最多可以取有限ơ,那么原则上也可以l出O(VN)的解法:遇到多重背包cd的物品用单调队列解即可。但如果不考虑过NOIP范围的算法的话,用P03中将每个q类物品分成O(log n[i])?1背包的物品的Ҏ(gu)也已l很优了?<br><br>结 <br>有h_困难的题目都是由单的题目叠加而来的。这句话是否公理暂且存之不论Q但它在本讲中已l得C充分的体现。本?1背包、完全背包、多重背包都不是什么难题,但将它们单地l合h以后得Cq样一道一定能吓倒不h的题目。但只要基础扎实Q领会三U基本背包问题的思想Q就可以做到把困隄题目拆分成简单的题目来解冟?<br>P05: 二维费用的背包问?<br>问题 <br>二维费用的背包问题是指:对于每g物品Q具有两U不同的费用Q选择qg物品必须同时付出q两U代P对于每种代h(hun)都有一个可付出的最大|背包定wQ。问怎样选择物品可以得到最大的价倹{设q两U代价分别ؓ代h(hun)1和代?Q第i件物品所需的两U代价分别ؓa[i]和b[i]。两U代价可付出的最大|两种背包定wQ分别ؓV和U。物品的价gؓw[i]?<br><br>法 <br>费用加了一l_只需状态也加一l即可。设f[i][v][u]表示前i件物品付ZU代价分别ؓv和u时可获得的最大h(hun)倹{状态{ULE就是:f [i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}。如前述Ҏ(gu)Q可以只使用二维的数l:当每件物品只可以取一ơ时变量v和u采用序的@环,当物品有如完全背包问题时采用逆序的@环。当物品有如多重背包问题时拆分物品?<br><br>物品M数的限制 <br>有时Q?#8220;二维费用”的条件是以这样一U隐含的方式l出的:最多只能取M件物品。这事实上相当于每g物品多了一U?#8220;件数”的费用,每个物品的g数费用均?Q可以付出的最大g数费用ؓM。换句话_设f[v][m]表示付出费用v、最多选m件时可得到的最大h(hun)|则根据物品的cdQ?1、完全、多重)用不同的Ҏ(gu)循环更新Q最后在f[0..V][0..M]范围内寻扄案?<br><br>另外Q如果要?#8220;恰取M件物?#8221;Q则在f[0..V][M]范围内寻扄案?<br><br>结 <br>事实上,当发现由熟?zhn)的动态规划题目变形得来的题目Ӟ在原来的状态中加一U以满新的限制是一U比较通用的方法。希望你能从本讲中初步体会到q种Ҏ(gu)?<br><br>P06: 分组的背包问?<br>问题 <br>有N件物品和一个容量ؓV的背包。第i件物品的费用是c[i]Qh(hun)值是w[i]。这些物品被划分q组Q每l中的物品互相冲H,最多选一件。求解将哪些物品装入背包可ɘq些物品的费用d不超q背包容量,且h(hun)值d最大?<br><br>法 <br>q个问题变成了每l物品有若干U策略:是选择本组的某一Ӟq是一仉不选。也是说设f[k][v]表示前kl物品花费费用v能取得的最大权|则有f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于Wkl}?<br><br>使用一l数l的伪代码如下: <br><br>for 所有的lk <br>for 所有的i属于lk <br>for v=V..0 <br>f[v]=max{f[v],f[v-c[i]]+w[i]} <br><br>另外Q显然可以对每组中的物品应用P02?#8220;一个简单有效的优化”?<br><br>结 <br>分组的背包问题将彼此互斥的若q物品称Z个组Q这建立了一个很好的模型。不背包问题的变Ş都可以{化ؓ分组的背包问题(例如P07Q,由分l的背包问题q一步可定义“泛化物品”的概念,十分有利于解题?<br><br>P07: 有依赖的背包问题 <br>化的问题 <br>q种背包问题的物品间存在某种“依赖”的关pR也是_i依赖于jQ表C选物品iQ则必须选物品j。ؓ了简化v见,我们先设没有某个物品既依赖于别的物品Q又被别的物品所依赖Q另外,没有某g物品同时依赖多g物品?<br><br>法 <br>q个问题由NOIP2006金明的预方案一题扩展而来。遵从该题的提法Q将不依赖于别的物品的物品称?#8220;Mg”Q依赖于某主件的物品UCؓ“附g”。由q个问题的简化条件可知所有的物品pq主件和依赖于每个主件的一个附仉合组成?<br><br>按照背包问题的一般思\Q仅考虑一个主件和它的附g集合。可是,可用的策略非常多Q包括:一个也不选,仅选择MgQ选择Mg后再选择一个附Ӟ选择Mg后再选择两个附g……无法用状态{ULE来表示如此多的{略。(事实上,设有n个附Ӟ则策略有2^n+1个,为指数。) <br><br>考虑到所有这些策略都是互斥的Q也是_你只能选择一U策略)Q所以一个主件和它的附g集合实际上对应于P06中的一个物品组Q每个选择了主件又选择了若q个附g的策略对应于q个物品l中的一个物品,其费用和价值都是这个策略中的物品的值的和。但仅仅是这一步{化ƈ不能l出一个好的算法,因ؓ物品l中的物品还是像原问题的{略一样多?<br><br>再考虑P06中的一句话Q?可以Ҏ(gu)l中的物品应用P02?#8220;一个简单有效的优化”。这提示我们Q对于一个物品组中的物品Q所有费用相同的物品只留一个h(hun)值最大的Q不影响l果。所以,我们可以对主件i?#8220;附g集合”先进行一?1背包Q得到费用依ơؓ0..V-c[i]所有这些值时相应的最大h(hun)值f'[0..V-c[i]]。那么这个主件及它的附g集合相当于V-c[i]+1个物品的物品l,其中费用为c[i]+k的物品的价gؓf'[k]+w[i]。也是说原来指数的策略中有很多策略都是冗余的Q通过一?1背包后,主件i转化?V-c[i]+1个物品的物品l,可以直接应用P06的算法解决问题了?<br><br>更一般的问题 <br>更一般的问题是:依赖关系以图Z“林”的Ş式给出(林卛_叉树的集合)Q也是_Mg的附件仍然可以具有自q附g集合Q限制只是每个物品最多只依赖于一个物品(只有一个主Ӟ且不出现循环依赖?<br><br>解决q个问题仍然可以用将每个Mg及其附g集合转化为物品组的方式。唯一不同的是Q由于附件可能还有附Ӟ׃能将每个附g都看作一个一般的01 背包中的物品了。若q个附g也有附g集合Q则它必定要被先转化为物品组Q然后用分组的背包问题解Z件及光仉合所对应的附件组中各个费用的附g所对应的h(hun)倹{?<br><br>事实上,q是一U树形DPQ其特点是每个父节点都需要对它的各个儿子的属性进行一ơDP以求得自q相关属性。这已经触及C“泛化物品”的思想。看完P08后,你会发现q个“依赖关系?#8221;每一个子树都{h(hun)于一件泛化物品,求某节点为根的子树对应的泛化物品相当于求其所有儿子的对应的泛化物品之和?<br><br>结 <br>NOIP2006的那道背包问题我做得很失败,写了上百行的代码Q却一分未得。后来我通过思考发现通过引入“物品l?#8221;?#8220;依赖”的概念可以加深对q题的理解,q可以解军_的推qK题。用物品l的思想考虑那题中极其特D的依赖关系Q物品不能既作主件又作附Ӟ每个Mg最多有两个附gQ可以发C个主件和它的两个附g{h(hun)于一个由四个物品l成的物品组Q这便揭CZ问题的某U本质?<br><br>我想_p|不是什么丢人的事情Q从p|中全无收h是?<br><br>P08: 泛化物品 <br>定义 <br>考虑q样一U物品,它ƈ没有固定的费用和价|而是它的价值随着你分配给它的费用而变化。这是泛化物品的概c?<br><br>更严格的定义之。在背包定w为V的背包问题中Q泛化物品是一个定义域?..V中的整数的函数hQ当分配l它的费用ؓvӞ能得到的价值就是h(v)?<br><br>q个定义有一点点抽象Q另一U理解是一个泛化物品就是一个数lh[0..V]Q给它费用vQ可得到价值h[V]?<br><br>一个费用ؓc价gؓw的物品,如果它是01背包中的物品Q那么把它看成泛化物品,它就是除了h(c)=w其它函数值都?的一个函数。如果它是完全背包中的物品,那么它可以看成这样一个函敎ͼ仅当v被c整除时有h(v)=v/c*wQ其它函数值均?。如果它是多重背包中重复ơ数最多ؓn的物品,那么它对应的泛化物品的函数有h(v)=v/c*w仅当v被c整除且v/c<=nQ其它情况函数值均??<br><br>一个物品组可以看作一个泛化物品h。对于一?..V中的vQ若物品l中不存在费用ؓv的的物品Q则h(v)=0Q否则h(v)为所有费用ؓv的物品的最大h(hun)倹{P07中每个主件及光仉合等价于一个物品组Q自然也可看作一个泛化物品?<br><br>泛化物品的和 <br>如果面对两个泛化物品h和lQ要用给定的费用从这两个泛化物品中得到最大的价|怎么求呢Q事实上Q对于一个给定的费用vQ只需枚D这个费用如何分配给两个泛化物品可以了。同LQ对?..V的每一个整数vQ可以求得费用v分配到h和l中的最大h(hun)值f(v)。也即f(v)=max{h(k) +l(v-k)|0<=k<=v}。可以看刎ͼf也是一个由泛化物品h和l军_的定义域?..V的函敎ͼ也就是说Qf是一个由泛化物品h?l军_的泛化物品?<br><br>由此可以定义泛化物品的和Qh、l都是泛化物品Q若泛化物品f满f(v)=max{h(k)+l(v-k)|0<=k<=v}Q则Uf是h与l的和Q即f=h+l。这个运的旉复杂度是O(V^2)?<br><br>泛化物品的定义表明:在一个背包问题中Q若两个泛化物品代以它们的和,不媄响问题的{案。事实上Q对于其中的物品都是泛化物品的背包问题,求它的答案的q程也就是求所有这些泛化物品之和的q程。设此和为sQ则{案是s[0..V]中的最大倹{?<br><br>背包问题的泛化物?<br>一个背包问题中Q可能会l出很多条gQ包括每U物品的费用、h(hun)值等属性,物品之间的分l、依赖等关系{。但肯定能将问题对应于某个泛化物品。也是_l定了所有条件以后,可以对每个非负整数v求得Q若背包定w为vQ将物品装入背包可得到的最大h(hun)值是多少Q这可以认ؓ是定义在非负整数集上的一件泛化物品。这个泛化物品——或者说问题所对应的一个定义域为非负整数的函数——包含了关于问题本n的高度浓~的信息。一般而言Q求得这个泛化物品的一个子域(例如0..VQ的g后,可以根据这个函数的取值得到背包问题的最l答案?<br><br>lg所qͼ一般而言Q求解背包问题,x解这个问题所对应的一个函敎ͼ卌问题的泛化物品。而求解某个泛化物品的一U方法就是将它表CZؓ若干泛化物品的和然后求之?<br><br>结 <br>本讲可以说都是我自己的原创思想。具体来_是我在学习函数式~程?Scheme 语言Ӟ用函数编E的眼光审视各类背包问题得出的理论。这一讲真的很抽象Q也许在“模型的抽象程?#8221;q一斚w已经出了NOIP的要求,所以暂且看不懂也没关系。相信随着你的OI之\逐渐延Q有一天你会理解的?<br><br>我想_“思?#8221;是一个OIer最重要的品质。简单的问题Q深入思考以后,也能发现更多?<br><br>P09: 背包问题问法的变?<br>以上涉及的各U背包问题都是要求在背包定wQ费用)的限制下求可以取到的最大h(hun)|但背包问题还有很多种灉|的问法,在这里值得提一下。但是我认ؓQ只要深入理解了求背包问题最大h(hun)值的Ҏ(gu)Q即佉K法变化了Q也是不难想出算法的?<br><br>例如Q求解最多可以放多少件物品或者最多可以装满多背包的I间。这都可以根据具体问题利用前面的方程求出所有状态的|f数组Q之后得到?<br><br>q有Q如果要求的?#8220;Mh(hun)值最?#8221;“Mg数最?#8221;Q只需单的上面的状态{ULE中的maxҎ(gu)min卛_?<br><br>下面说一些变化更大的问法?<br><br>输出Ҏ(gu) <br>一般而言Q背包问题是要求一个最优|如果要求输出q个最优值的Ҏ(gu)Q可以参照一般动态规划问题输出方案的Ҏ(gu)Q记录下每个状态的最优值是q态{ULE的哪一Ҏ(gu)出来的,换句话说Q记录下它是由哪一个策略推出来的。便可根据这条策略找C一个状态,从上一个状态接着向前推即可?<br><br>q是?1背包ZQ方Eؓf[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。再用一个数lg[i] [v]Q设g[i][v]=0表示推出f[i][v]的值时是采用了方程的前一(也即f[i][v]=f[i-1][v]Q,g[i][v]表示采用了方E的后一V注意这两项分别表示了两U策略:未选第i个物品及选了Wi个物品。那么输出方案的伪代码可以这样写Q设最l状态ؓf[N][V]Q: <br><br>i=N <br>v=V <br>while(i>0) <br>if(g[i][v]==0) <br>print "未选第i物? <br>else if(g[i][v]==1) <br>print "选了Wi物? <br>v=v-c[i] <br><br>另外Q采用方E的前一Ҏ(gu)后一也可以在输出方案的q程中根据f[i][v]的值实时地求出来,也即不须U录g数组Q将上述代码中的g[i] [v]==0Ҏ(gu)f[i][v]==f[i-1][v]Qg[i][v]==1Ҏ(gu)f[i][v]==f[i-1][v-c[i]]+w[i]也可?<br><br>输出字典序最的最优方?<br>q里“字典序最?#8221;的意思是1..NL品的选择Ҏ(gu)排列出来以后字典序最。以输出01背包最字典序的方案ؓ例?<br><br>一般而言Q求一个字典序最的最优方案,只需要在转移时注意策略。首先,子问题的定义要略改一些。我们注意到Q如果存在一个选了物品1的最优方案,那么{案一定包含物?Q原问题转化Z个背包容量ؓv-c[1]Q物品ؓ2..N的子问题。反之,如果{案不包含物?Q则转化成背包容量仍为VQ物品ؓ2..N的子问题。不答案怎样Q子问题的物品都是以i..N而非前所q的1..i的Ş式来定义的,所以状态的定义和{ULE都需要改一下。但也许更简易的Ҏ(gu)是先把物品逆序排列一下,以下按物品已被逆序排列来叙q?<br><br>在这U情况下Q可以按照前面经典的状态{ULE来求|只是输出Ҏ(gu)的时候要注意Q从N?输入Ӟ如果f[i][v]==f[i-v]及f[i][v]==f[i-1][f-c[i]]+w[i]同时成立Q应该按照后者(即选择了物品iQ来输出Ҏ(gu)?<br><br>求方案L <br>对于一个给定了背包定w、物品费用、物品间怺关系Q分l、依赖等Q的背包问题Q除了再l定每个物品的h(hun)值后求可得到的最大h(hun)值外Q还可以得到装满背包或将背包装至某一指定定w的方案L?<br><br>对于q类改变问法的问题,一般只需状态{ULE中的maxҎ(gu)sum卛_。例如若每g物品均是01背包中的物品Q{ULE即为f[i][v]=sum{f[i-1][v],f[i-1][v-c[i]]+w[i]}Q初始条件f[0][0]=1?<br><br>事实上,q样做可行的原因在于状态{ULE已l考察了所有可能的背包l成Ҏ(gu)?<br><br>最优方案的L <br>q里的最优方案是指物品Mh(hun)值最大的Ҏ(gu)。还是以01背包Z?<br><br>l合求最大Mh(hun)值和Ҏ(gu)L两个问题的思\Q最优方案的L可以q样求:f[i][v]意义同前qͼg[i][v]表示q个子问题的最优方案的LQ则在求f[i][v]的同时求g[i][v]的伪代码如下Q?<br><br>for i=1..N <br>for v=0..V <br>f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} <br>g[i][v]=0 <br>if(f[i][v]==f[i-1][v]) <br>inc(g[i][v],g[i-1][v] <br>if(f[i][v]==f[i-1][v-c[i]]+w[i]) <br>inc(g[i][v],g[i-1][v-c[i]]) <br><br>如果你是W一ơ看到这L问题Q请仔细体会上面的伪代码?<br><br>结 <br>昄Q这里不可能I尽背包cd态规划问题所有的问法。甚臌存在一cd背包cd态规划问题与其它领域Q例如数论、图论)l合h的问题,在这论背包问题的专文中也不会论及。但只要深刻领会前述所有类别的背包问题的思\和状态{ULE,遇到其它的变形问法,只要题目隑ֺq属于NOIPQ应该也不难惛_法?<br><br>触类旁通、D一反三Q应该也是一个OIer应有的品质吧?/font></div> <img src ="http://www.shnenglu.com/Onway/aggbug/137617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Onway/" target="_blank">Onway</a> 2010-12-28 19:07 <a href="http://www.shnenglu.com/Onway/articles/137617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++格式控制 (l典Q?http://www.shnenglu.com/Onway/articles/136530.htmlOnwayOnwayWed, 15 Dec 2010 14:06:00 GMThttp://www.shnenglu.com/Onway/articles/136530.htmlhttp://www.shnenglu.com/Onway/comments/136530.htmlhttp://www.shnenglu.com/Onway/articles/136530.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/136530.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/136530.html阅读全文

Onway 2010-12-15 22:06 发表评论
]]>
《\在何斏V?转自博客?marvinyanehttp://www.shnenglu.com/Onway/articles/132260.htmlOnwayOnwayWed, 03 Nov 2010 01:23:00 GMThttp://www.shnenglu.com/Onway/articles/132260.htmlhttp://www.shnenglu.com/Onway/comments/132260.htmlhttp://www.shnenglu.com/Onway/articles/132260.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/132260.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/132260.html转眼间就大四了,只能感慨下时间过的真快啊。刚上大学的时候整天想着d校园到社会上展示自己Q现在真的要CQ想问下自己准备好了吗?
    计算机科学与技术,当初毫无概念的报上这个专业,具体怎么来到q个学校q个专业的我也不清楚了,不过q运的是我们专业90%以上的h也不知道他们怎么来的Q至有点归属感了呵c随遇而安来到学校开始了自己的计机生Q说实话我还是很喜欢q个专业Q至让我感觉到自己的h生h(hun)|毕竟我们都是理科生都对自q逻辑思维能力很自信嘛Q所以哥们从此展开了我的计机生?/font>
    我想对于一个初学者来说没有什么比他的入门导师更重要了Q那时候我对于计算机的世界来说是一张白U,没想到被人泼墨了呵呵Q我们大学第一学期学的~程语言是JavaQ简单单的一学期是在学习什么是面向对象了,可?zhn)的是我还不知道什么是面向q程Q再说难道编E语a只有这L单单的两U分cdQ伴随着出入大学的新鲜感p样度q了自己的大学一qQ那时候傻乎乎的以为我只要学好了Java是高手了,呵呵Q好清纯的感觉啊?/font>
    大学二年U,q轻嘛,q道追奛_U甜蜜了,把计机基础的学习从体系l构、汇~、数据结构、离散数学等{都l落下了Q一是因己整天想着和美女约会了没时间学习反正考试几个很简单(切的说?0分很单)二是自己Ҏ(gu)不知道什么才是计机的基Q那时候我q以己很牛B呢,整天在那学习web开发了Q毕竟是学了java基础的,学习起J2EE来也很简单了Q就开始学习SSH框架QJavaEE开发^C的所有ؕ七八p的东西几乎全部接触q了Q偶还能用q点东西拿个奖什么的Q自以ؓ我大二的时候J2EE都这么牛B了我是传说中的高手了,哈哈Q那时候自q感觉是大丰收啊Q老婆有了、荣誉有了(那个奖可是我们学校计机的最高荣誉了呵呵Q,事业也有眉目了(自己在外面的公司找个兼职做个网站什么的Q,唉,感觉生活一片美好的景象啊?/font>
    大学三年U上学期仍旧停留在那个阶D什么都不懂Q还整天的J2EE、整天的U会Q计机|络、操作系l这些基评自己Ҏ(gu)q不上眼啊Q当时就惛_都搞web开发了q些东西学v来有什么用啊,呵呵Q那时候还有个感觉是目空一切啊Q充分理解了井底之蛙是什么意思)Q我们学校的老师也拿我当个宝贝,说我的水q现在放眼整个同龄界都应该算是可以的了,x看自q个pi啊?除了能做个网站还能干什么呢Q?/font>
    好吧Q一切的转折点就?010q??号了Q我和她分手了,那个让我痴迷了一q半让我心碎了八个月的女孩分手了Q具体的原因应该是늝늝放狠话完了,呵呵Q想想那时候真的很q轻啊,q样都能分手Q我一直相信我们的感情很好Q就是太M呵呵Q。一个月后我知道我真得失M了,痛苦的男人L最可怕的嘛,我寒假没有回家自׃个hw在一个出U房里思考自q人生呵呵Q现在想x好玩的)同时度过了自׃十岁的生日,x自己一个奔三的ZQ我有什么资本能够在q个C会上立I记得当时啃着肉夹馍在漆黑的角落里抽泣的时候,那个忍不住给安打电(sh)话哭了半个多时的男孩真的彻底想明白了(真的不知道怎么x白了CS专业不是学习web开发的Q我x自己以前应该有些概念了但是不惛_面对吧,现在自己有了勇气了,或者说真的想给自己即一个挑战啊Q,我彻底抛弃了那个曄引以的web开发?/font>
    ?月到现在转眼5个月pMQ自׃旧走在当初经q三U钟思考定下的路上Q我x是q样不管对与错只要自q选择我就没有攑ּ的(除了她)Q从图书馆借来了很多很多关于计机U学知识的书c,从网上查扄资料Q到底想x应该怎么赎ͼ我应该干什么?整天w在q_上面做开发对于v我们q个名号啊,哥们可是搞CS的,U学啊呵呵,一不小心成个家了那是U学家啊Q虽然社会比较Qw但是我们应该坚持自q方向不要q失在这个五光十色的计算机的世界里,否则我们怎么才能q赶上摩的速度呢?好吧Q我军_做底层开发了Q做一些和操作pȝ同一个层ơ上的东西,具体什么还没有惛_Q既然不知道具体做什么就从基开始吧Q哥q个C语言都没有学q啊Q那׃C语言开始学起吧Q抱着基本C语言的书开始看呗,反正也有点编E语a的功底学习点基础的东西还应该没有多大的问题,虽然C语言博大到让我感慨无以复加的地步Q我想怎么q么多东襉K要注意呢Q怪不得h安说JAVA好学呢,学习完C语言是数据l构和算法分析了Q我q闷了我们堂堂CS专业的h怎么对于q个q这么陌生呢Q几乎就是从头开始学习了呵呵Q从DP到搜索,从链表到图,׃八糟的慢慢来呗,下面是操作pȝ了,不知不觉d׃了UNIXQ我想了像WINq么垃圾的东西怎么会这么流行呢Q没别的意思哈Q,每天都在q不及待的学习着新知识,从基操作到系l编E(好吧我知道下面的我还没有学习Q至憧憬下应该q可以吧Q从|络~程到内核分析,从驱动开发到嵌入式哇哈哈q么多优U的东西真有种久在樊笼里,复得q自然的感觉啊哇哈哈?/font>
    好吧我知道就我现在的水^来说我还是很菜很菜的Q现在只是站在v边听见v啸还没看见大长什么样呢,呵呵Q不q哥们就有这么个品质什么也不怕,慢慢来呗Q我感觉按照我现在自己定制的学习计划来说给我三q我也是大牛Q?/font>
    其实我们有时候缺乏的是亡羊补牢的勇气,p|了还可以从头再来Q错误了Ҏ(gu)好?/font>
    其实我们一直在路上Q敢问\在何方,路在脚下Q?/font>
    谨以此文奠大学逝去的光_逝去的爱情?/font>

Onway 2010-11-03 09:23 发表评论
]]>
《原?计算机系学生大学四年应该q样q?转自博客?帅子http://www.shnenglu.com/Onway/articles/132259.htmlOnwayOnwayWed, 03 Nov 2010 01:22:00 GMThttp://www.shnenglu.com/Onway/articles/132259.htmlhttp://www.shnenglu.com/Onway/comments/132259.htmlhttp://www.shnenglu.com/Onway/articles/132259.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/132259.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/132259.html1.
极端的社会舆?/font>

每每看到大学生就业报告里提到计算机系学生׃人数最多时Q我想mnQ什么原因导致了q种现象的发生,在中国Y件还处于比较初的阶D|Q市场对软g人才的需求应该每q在大幅的递增Q可是大学里培养出来的计机U班人才质量却每冉|下,甚至q不如一个Y件培训机构两三个月训l出来的人好用,Z?/font>?x现在的计机U班毕业生的水^吧,大学四年下来Q?/font>90%的学生写的代码没有超q?/font>2000行,?/font>Linux操作pȝZ物,不知?/font>C++?/font>Vc的区别,没有开发出一块实用功能的单YӞ 没有使用q?/font>STLQ甚至不?/font>STLZ物,更不用提设计模式之类的比较高U一点的东西?/font>……q样的例子还能D出很?/font>
是q样的h才质量,如何让一个以营利为目的的公司接受Q如何ؓ企业创造h(hun)| 但是也有那么一些hQ能q入微Y?/font>IBM?/font>google、百度这L公司Q拿着q薪几十万?/font>

2. p|的计机教育体制
我也是一名毕业不久的计算机科班毕业生Q从我目前了解的情况看来Q大学时Q没有几个学生真正的对计机~程感兴,体会不到通过~程解决问题带来的乐?/font>,只是单纯的跟着评的设|学习,q样没有目的性的学习效率如何之底Q大学里的学生又有几个h能对自己的职业规划有一个基本的了解Q大学里有几个h能理解学习的评在具体的实践中的作用Q?/font> q些惨痛的例子说明了我们大学对计机pd生的引导是非怸够的Q没能激起对学习计算机技术的兴趣Q不能告诉大家一个将来一个明的职业规划方向Q没有很好的引导学生L考自q职业规划方向Q如果是q种状态去学习Q大学四q基本是废掉?/font>……
另外一个就是大学课E的讄Q各U各L评Q填鸭式的教学方?/font>…. Ua理论式的教学方式….到头来,学生真正学到了什么?几个术语名词而已…..一样对操作pȝ是那Lq….不知道编译原理的语法分析Z物? 不知道数据结构中的树和图有何用Q?/font>

3. 四年后,我能骄傲的说我是计算机系的学?/font>
上面发了那么多的牢骚Q其实都是有感而发….下面在结合自q工作的感受具体谈谈计机学生应该如何规划自己的大学四q?/font>
大一Q?/font>
一个新兵蛋子,刚走q象牙塔的大门,什么都是新鲜的Q不断听着学长们说着天书般的技术术?/font>天天争论C++?/font>java哪个好,.net是否?/font>Vc更智能先q?/font>…. q有什?/font>Asp.net …. 一堆的技术摆在自己面前了
然后自己q涂了….去问学长?/font>学长告诉?/font>..好好学习java?/font>来有钱?/font>…..
其实大一Q没必要学习各种新鲜的技?/font>…..把高{数学学好吧….q才是正事,是决定了着来你是否能UCؓ一个大牛还是一个编E语a的熟l操作工人的因素…. 也许q时候的你还不知道高{数学有什么作?/font>
但我要告诉你的是如果你的(zhn)性高…. 工作一两年也许p体会到数学的做用…. 学高?/font>..不是单单的学习微U分…. 在掌握这些知识的时?/font>….ȝ自己的逻辑思维….. ȝ自己的思考问题解决问题的Ҏ(gu)和能力。作用在来一定大大的….. {将来如果你涉密码?/font>你会发现各种U分方程和矩阵变?/font>…. 来在计一个算法的复杂性和证明法的可靠性时Q也M开数学知识…. 如果你涉h工智能和语音识别Q各U统计模型就会呈现在你面前。在你毕业找工作Ӟq个才是你和专业培训机构培训出来的学生的差异能力。这才是企业更看重的能力。如果你q有旉的话Q学?/font>C语言但是不要再用谭浩强的书了…. ?/font>
The C program langue ?/font>如果能真正领(zhn)书?/font>70%的例子话Q那p够了. 如果能把q两门课E学到十分优UQ恭喜你Q你已经成功了一半了…..

大二Q?/font>
如果你在大一学习?/font>C之后Q这个时候大学的评p涉及操作pȝ和数据结构、还有汇~语a?/font>…… q也是大二一定要学好的两门课?/font>……大学的操作系l太p|了,上完译֐Q很多的学生不知道所云,更加感觉操作pȝ的神U了Q课E设计也是什么银行家法的,然后大家在网上一搜索,然后交给老师q完事?/font>
其实Q我的徏议是自己写一个操作系l内核,实现内存理Q进E管理和切换 {一些基的东西了可以了Q《自己动手写操作pȝ》就是很好的教材…… 如果q有旉Q学习?/font>Linux内核设计与实现》,看看现实商用的操作系l是怎么实现的? 当然最好和原码l合的一LQ效果最好。还有n炯博士的 .012Linux内核完全剖析”什么的。如果能仔细阅读Q收获一定不。当然还有数据结构,q个也是重中之中Q这也是和非U班n的学生的差别Q关键是你学的好坏,q个的实践主要在ACM上,当学习完数据l构后,最重要的是使用Q不断的?/font>Acm上做各种各样的题目,不断的提升自q法设计的能力。从大二开始,如果能坚持两q下来,那么一般的法设计肯定是难不住的了Q也许这时候高数打下的基础׃起作用了?/font>
当毕业的时候,q入一家好的公司应该不是太隄事情了。再说说汇编语言Q本质上q也是一门编E语aQ可能刚入门的时候比较困难,但是E序写多了,?/font>C也没有差别了。我q想说一点,是现在Windows内核也逐步开放了Q至有很多的逆向的资源可以学习。如果对Windows有兴,一样可以学习操作系l的实现原理?/font>

大三Q?/font>
L数学和编译原理是个重头戏Q离散数学虽然我现在q没体会C的作用,但是和高CPq中内在的东西才是最重要的,代表着内功Q如果没有学好,q些早还要要q的?/font> ~译原理Q学习完以后一样会让你云里NQ整天做那些无聊的题目。还是说实践吧,|上有开源的C~译器的源码Q下载下来然后好好学习下Q结合编译原理书中讲的东西,好好的消化一些这些知识,最后,自己如果能写出来一?/font>C~译器的话,那你的编译原理也通过了。当然这个时候可以学习一?/font>C++?/font>Java之类语言Q但是学到够qx用的可以了Q没有学非常深。选择一本教材学习两三个月就行了?/font>


当然Q这个时候,可能你的同学已经能做出来各种漂亮的网,也可能熟l的使用MFCcd做出各种各样的漂亮的软gQ这些没什么,如果三年下来Q如果你能够按照上面我写的那样坚持学习。也总们用三年学习的这些东西,你用三个月就能熟l?/font>

大四Q?/font>
C扑ַ作的时候,如果你按照上面一步一个脚印的学习Q我怿你会收到很多大公司的offer。因为大公司更看重的是你的内功的深厚Q而小公司才会看重那些花拳l腿的技术。但是这个时候,千万不要忘记l箋学习Q很多的学生大四一q都费掉了Q真实太可惜了,在前面三q的基础上,C厚积薄发的时候了Q?/font>
开始要思考自q职业规划了,你要选择Linux方向q是Windows方向Q要选择底层方向q是应用方向Q?/font>
要选择|页方向q是桌面应用方向。是选择自然语言处理q是人工。这个时候你要选择自己的一个方向,当然你可以向你的导师求助Q然后确定自q发展方向Q大四一q就可以专心的学习了?/font>


4. 附上我认机学习比较好辅助教材:

C语言Q?/font> the C Program Language
操作pȝ; 于渊Q《自己动手写操作pȝ?/font>

?/font>Linux内核设计与实现?/font>

?/font>Linux内核完全剖析?/font>

?/font>Linux内核情景分析?/font>

?/font>Windows内核情景分析?/font>
~译原理Q?/font> 龙书《编译原理?/font>
汇编Q?/font>
王爽老师《汇~第二版?/font>

5. 后记

以上都是自己在工作后对大学四q的反思,可能很多人有不一L看法Q我没有M异议。毕竟每个hl历是不一LQ但是如果你向想做真正的计算机科班出w的学生Q学好上面介l的评吧。在以后的职业生涯中Q你会终w受益的。当然上面很多的评我没有提刎ͼq不代表他们不需要学习,只是分量没有那么重而已。因Zq是要毕业的Q每门功课还是要q的?/font>zds

当然Q我现在认ؓQ计机的本U四q真是一个打基础的四q_之后才是学习各种招式Q如果基打好了,招式的学习会事半功倍的。当q入公司后,一栯持箋不断的学习,才能让你不断的进步。自己文采不好,写的比较乱,但都是肺腑之aQ各位将q吧?/font>



Onway 2010-11-03 09:22 发表评论
]]>
熟?zhn)C++标准库(转)http://www.shnenglu.com/Onway/articles/132257.htmlOnwayOnwayWed, 03 Nov 2010 01:15:00 GMThttp://www.shnenglu.com/Onway/articles/132257.htmlhttp://www.shnenglu.com/Onway/comments/132257.htmlhttp://www.shnenglu.com/Onway/articles/132257.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/132257.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/132257.htmlC++标准库非常大。在C++标准中,关于标准库的规格说明占了密密麻麻300多页Q这q不包括标准C库,后者只?"作ؓ参?包含在C++库中?/p>

 

当然Qƈ非L大好Q但在现在的情况下,实大好Q因为大的库会包含大量的功能。标准库中的功能多Q开发自q应用E序时能借助的功能就多。C++库ƈ非提供了一切(没有提供q发和图形用h口的支持Q,但确实提供了很多。几乎Q何事都可以求助于它?/p>

 

因ؓ标准库中东西如此之多Q你所选择的类名或函数名就很有可能和标准库中的某个名字相同。ؓ了避免这U情冉|造成的名字冲H,实际上标准库中的一切都被放在名字空间std中。但q带来了一个新问题。无数现有的C++代码都依赖于使用了多q的伪标准库中的功能Q例如,声明?lt;iostream.h>Q?lt;complex.h>Q?lt;limits.h>{头文g中的功能。现有Y件没有针对用名字空间而进行设计,如果用std来包装标准库D现有代码不能用,是一U可耻行为?/p>

 

慑于被激怒的E序员会产生的破坏力Q标准委员会军_为包装了std的那部分标准库构件创建新的头文g名。生成新头文件的Ҏ(gu)仅仅是将现有C++头文件名中的 .h LQ方法本w不重要Q正如最后生的l果不一致也q不重要一栗所?lt;iostream.h>变成?lt;iostream>Q?lt;complex.h>变成?lt;complex>Q等{。对于C头文Ӟ采用同样的方法,但在每个名字前还要添加一个c。所以C?lt;string.h>变成?lt;cstring>Q?lt;stdio.h>变成?lt;cstdio>Q等{。最后一Ҏ(gu)Q旧的C++头文件是官方所反对使用的(x列Z再支持)Q但旧的C头文件则没有Q以保持对C的兼Ҏ(gu))。实际上Q编译器刉商不会停止对客L有Y件提供支持,所以可以预计,旧的C++头文件在未来几年内还是会被支持?/p>

所以,实际来说Q下面是C++头文件的现状Q?/p>

 

· 旧的C++头文件名?lt;iostream.h>会l箋被支持,管它们不在官方标准中。这些头文g的内容不在名字空间std中?/p>

· 新的C++头文件如<iostream>包含的基本功能和对应的旧头文件相同,但头文g的内容在名字I间std中。(在标准化的过E中Q库中有些部分的l节被修改了Q所以旧头文件和新头文g中的实体不一定完全对应。)

· 标准C头文件如<stdio.h>l箋被支持。头文g的内容不在std中?/p>

· hC库功能的新C++头文件具有如<cstdio>q样的名字。它们提供的内容和相应的旧C头文件相同,只是内容在std中?/p>

 

所有这些初看有Ҏ(gu),但不难习惯它。最大的挑战是把字符串头文g理清楚:<string.h>是旧的C头文Ӟ对应的是Zchar*的字W串处理函数Q?lt;string>是包装了std的C++头文Ӟ对应的是新的stringc;<cstring>是对应于旧C头文件的std版本。如果能掌握q些Q其余的也就Ҏ(gu)了?/p>

 

关于标准库,需要知道的W二Ҏ(gu)Q库中的一切几乎都是模ѝiostream帮助你操作字W流Q但什么是字符Q是char吗?是wchar_tQ是Unicode字符Q一些其它的多字节字W?没有明显正确的答案,所以标准库让你去选。所有的类Qstream classQ实际上是类模板Q在实例化流cȝ时候指定字W类型。例如,标准库将coutcd定义为ostreamQ但ostream实际上是一个basic_ostream<char>cd定义Qtypedef Q?/p>

 

cM的考虑适用于标准库中其它大部分cRstring不是c,它是cL板:cd参数限定了每个stringcM的字W类型。complex不是c,它是cL板:cd参数限定了每个complexcM实数部分和虚数部分的cd。vector不是c,它是cLѝ如此不停地q行下去?/p>

在标准库中无法避开模板Q但如果只是习惯于和charcd的流和字W串打交道,通常可以忽略它们。这是因为,对这些组件的char实例Q标准库都ؓ它们定义了typedefQ这样就可以在编E时l箋使用cinQcoutQcerr{对象,以及istreamQostreamQstring{类型,不必担心cin的真实类型是basic_istream<char>以及string的真实类型是basic_string<char>?/p>

 

标准库中很多lg的模板化和上面所的大不相同。再看看那个概念上似乎很直观的string。当Ӟ可以Z "它所包含的字W类? 定它的参数Q但不同的字W集在细节上有不同,例如Q特D的文gl束字符Q拷贝它们的数组的最有效方式Q等{。这些特征在标准中被UCؓtraitsQ它们在string实例中通过另外一个模板参数指定。此外,string对象要执行动态内存分配和释放Q但完成q一d有很多不同的Ҏ(gu)。哪一个最好?选择Qstring模板有一个Allocator参数QAllocatorcd的对象被用来分配和释放string对象所使用的内存?/p>

 

q里有一个basic_string模板的完整声明,以及建立在它之上的stringcd定义QtypedefQ;可以?lt;string>头文件中扑ֈ它(或与之相当的什么东西)Q?/p>

 

namespace std {

   template<class charT,
            class traits = char_traits<charT>,
            class Allocator = allocator<charT> >
      class basic_string;

   typedef basic_string<char> string;

}

 

注意Qbasic_string的traits和Allocator参数有缺省倹{这在标准库中是很典型的做法。它Z用者提供了灉|性,但对于这U灵zL所带来的复杂性,那些只想?"正常" 操作?典型" 用户却又可以避开。换句话_如果只想使用象C字符串那L字符串对象,可以用string对象Q而不用在意实际上是在用basic_string<char, char_traits<char>, allocator<char> >cd的对象?/p>

 

通常可以q么做,但有时还是得E稍看看底层。例如,声明一个类而不提供定义h优点Q它q指出,下面是一U声明stringcd的错误方法:

class string;                    // 会通过~译Q?/p>

 

先不要考虑名字I间Q这里真正的问题在于Qstring不是一个类Q而是一个typedef。如果可以通过下面的方法解决问题就太好了:

typedef basic_string<char> string;

 

但这又不能通过~译?所说的basic_string是什么东西?" ~译器会奇?---- 当然Q它可能会用不同的语句来问你。所以,Z声明stringQ首先得声明它所依赖的所有模ѝ如果可以这么做的话Q就会象下面q样Q?/p>

 

template<class charT> struct char_traits;

template<class T> class allocator;

template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;

typedef basic_string<char> string;

 

然而,你不能声明string。至不应该。这是因为,标准库的实现者声明的stirngQ或std名字I间中Q何其它东西)可以和标准中所指定的有所不同Q只要最l提供的行ؓW合标准p。例如,basic_string的实现可以增加第四个模板参数Q但q个参数的缺省值所产生的代码的行ؓ要和标准中所说的原始的basic_string一致。那到底该怎么办?不要手工声明stringQ或标准库中其它M部分Q。相反,只用包含一个适当的头文gQ如<string>?/p>

 

有了头文件和模板的这些知识,现在可以看看标准C++库中有哪些主要组Ӟ

· 标准C库。它q在Q还可以用它。虽然有些地Ҏ(gu)点小的修修补补,但无论怎么_q是那个用了多年的C库?/p>

 

· Iostream。和 "传统" Iostream的实现相比,它已l被模板化了Q承层ơ结构也做了修改Q增Z抛出异常的能力,可以支持stringQ通过stringstreamc)和国际化Q通过localesQ。当Ӟ你期望Iostream库所h的东西几乎全都l存在。也是_它还是支持流~冲区,格式化标识符Q操作子和文Ӟq有cinQcoutQcerr和clog对象。这意味着可以把string和文件当做流Q还可以Ҏ(gu)的行行更q泛的控Ӟ包括~冲和格式化?/p>

 

· String。string对象在大多数应用中被用来消除对char*指针的用。它们支持你所期望的那些操作(例如Q字W串q接Q通过operator[]对单个字W进行常量时间的访问,{等Q,它们可以转换成char*Q以保持和现有代码的兼容性,它们q自动处理内存管理。一些string的实现采用了引用计数Q这会带来比Zchar*的字W串更佳的性能Q时间和I间上)?/p>

 

· 容器。标准库提供了高效的容器实现QvectorQ就象动态可扩充的数l)QlistQ双链表Q,queueQ?stackQdequeQmapQset和bitset。但多少可以作ؓ补偿的一Ҏ(gu)Q?string是容器。这很重要,因ؓ它意味着对容器所做的M操作对string也适用?/p>

标准库规定了每个cȝ接口Q而且每条接口规范中的一部分是一套性能保证。所以,举例来说Q无论vector是如何实现的Q仅仅提供对它的元素的访问是不够的,q必L?"帔R旉" 内的讉K。如果不q样Q就不是一个有效的vector实现?/p>

很多C++E序中,动态分配字W串和数l导致大量用new和deleteQnew/delete错误 ---- 其是没有delete掉new出来的内存而导致的泄漏 ---- 时常发生。如果用string和vector对象Q二者都执行自n的内存管理)而不使用char*和动态分配的数组的指针,很多new和delete可以免于用,使用它们所带来的问题也会随之消失?/p>

 

· 法。标准库提供了大量易的Ҏ(gu)Q即Q预定义函数Q官方称为算?algorithm) ---- 实际上是函数模板Q,其中的大多数适用于库中所有的容器 ---- 以及内徏数组Qbuilt-in arraysQ?/p>

法容器的内容当作序列QsequenceQ,每个法可以应用于一个容器中所有值所对应的序列,或者一个子序列QsubsequenceQ。标准算法有for_eachQؓ序列中的每个元素调用某个函数Q,findQ在序列中查扑֌含某个值的W一个位|,count_ifQ计序列中使得某个判定为真的所有元素的数量Q,equalQ确定两个序列包含的元素的值是否完全相同)QsearchQ在一个序列中扑և某个子序列的起始位置Q,copyQ拷贝一个序列到另一个)QuniqueQ在序列中删除重复|QrotateQ旋转序列中的|QsortQ对序列中的值排序)。注意这里只是抽取了所有算法中的几个;标准库中q包括其它很多算法?/p>

和容器操作一P法也有性能保证。例如,stable_sort法执行时要求不过0比较U?N log N) 。(stable_sort提供的性能必须和最高效的通用排序法在同一个别。)

 

· 对国际化的支持。不同的文化以不同的方式行事。和C库一PC++库提供了很多Ҏ(gu)有助于开发出国际化的软g。但虽然从概念上来说和CcMQ其实C++的方法还是有所不同。例如,C++为支持国际化q泛使用了模板,q利用了l承和虚函数Q这些一定不会让你感到奇怪?/p>

支持国际化最主要的构件是facets和locales。facets描述的是对一U文化要处理哪些Ҏ(gu),包括排序规则Q即Q某地区字符集中的字W应该如何排序)Q日期和旉应该如何表示Q数字和货币值应该如何表C,怎样信息标识符映射成(自然的)明确的语a信息Q等{。locales多lfacets捆绑在一赗例如,一个关于美国的locale包括很多facetsQ描q如何对国p字符串排序,如何以适合国人的方式d日期和时_d货币和数字|{等。而对于一个关于法国的locales来说Q它描述的是怎么以法国h所习惯的方式完成这些Q务。C++允许单个E序中同时存在多个localesQ所以一个应用中的不同部分可能采用的是不同的规范?/p>

 

· Ҏ(gu)字处理的支持。C++库ؓ复数c(实数和虚数部分的_ֺ可以是floatQdouble或long doubleQ和专门针对数值编E而设计的Ҏ(gu)数组提供了模ѝ例如,valarraycd的对象可用来保存可以L混叠(aliasing)的元素。这使得~译器可以更充分地进行优化,其是对矢量计算机来说。标准库q对两种不同cd的数l片提供了支持,q提供了法计算内积(inner product)Q部分和(partial sum)Q?adjacent difference){?/p>

 

· 诊断支持。标准库支持三种报错方式QC的断aQ错误号Q例外。ؓ了有助于Z外类型提供某U结构,标准库定义了下面的例外类Qexception classQ层ơ结构:

                                                    |---domain_error
                     |----- logic_error<---- |---invalid_argument
                     |                               |---length_error
                     |                               |---out_of_range
exception<--|
                     |                                |--- range_error
                     |-----runtime_error<--|---underflow_error
                                                     |---overflow_error

logic_errorQ或它的子类Q类型的例外表示的是软g中的逻辑错误。理Z来说Q这L错误可以通过更仔l的E序设计来防止。runtime_errorQ或它的子类Q类型的例外表示的是只有在运行时才能发现的错误?/p>

可以p样用它们,可以通过l承它们来创q例外c,或者可以不ȝ它。没有h你用它?/p>

上面列出的内容ƈ没有늛标准库中的一切?/p>

 

标准库中容器和算法这部分一般称为标准模板库。STL中实际上q有W三个构?---- q代子(IteratorQ。P代子是指针似的对象,它让STL法和容器共同工作?/p>

 

STL是标准库中最具创新的部分Q这q不是因为它提供了容器和法Q虽然它们非常有用)Q而是因ؓ它的体系l构。简单来_它的体系l构h扩展性:可以对STLq行d。当Ӟ标准库中的组件本w是固定的,但如果遵循STL构徏的规范,可以写出自己的容器,法和P代子Q它们可以和标准STLlg一起工作,p标准lg自n之间怺工作一栗还可以利用别h所写的W合STL规范的容器,法和P代子Q就象别人利用你的一栗得STLh创新意义的原因在于它实际上不是YӞ而是一套规范(conventionQ。标准库中的STLlg只是具体体现了遵循这U规范所能带来的好处?/p>

 

通过使用标准库中的组Ӟ通常可以避免从头到尾来设计自qIO,stringQ容器,国际化,数值数据结构以及诊断等机制。这有更多的时间和_֊d注Y件开发中真正重要的部分:实现软g的其他功能?br>

转自Q?a >http://hi.baidu.com/why0813/blog/item/850ea46eecf658db80cb4a6a.html



Onway 2010-11-03 09:15 发表评论
]]>
max()函数http://www.shnenglu.com/Onway/articles/121710.htmlOnwayOnwayFri, 30 Jul 2010 09:09:00 GMThttp://www.shnenglu.com/Onway/articles/121710.htmlhttp://www.shnenglu.com/Onway/comments/121710.htmlhttp://www.shnenglu.com/Onway/articles/121710.html#Feedback0http://www.shnenglu.com/Onway/comments/commentRss/121710.htmlhttp://www.shnenglu.com/Onway/services/trackbacks/121710.html首先,max()在标准C++中的是个函数而非?它在不同~译pȝ中的实际定义如下: 
=========================================================== 
linux   下的   g++,头文?<algorithm> 
template   <class   _Tp> 
inline   const   _Tp&   max(const   _Tp&   __a,   const   _Tp&   __b)   { 
    return     __a   <   __b   ?   __b   :   __a; 
} 
=========================================================== 
windows   下的   VC6,头文?<algorithm>   (最新的VS.net没试q?不敢妄言) 
template <class   _Ty>   inline 
const   _Ty&   _cpp_max(const   _Ty&   _X,   const   _Ty&   _Y) 
{return   (_X   <   _Y   ?   _Y   :   _X);   } 
=========================================================== 

看到了吗?   g++按照标准C++的规定把它定义ؓmax();而VC6自作d把它变成了_cpp_max(). 
事实?我提问时所附的源代码是W合标准C++规则?在g++下顺利编?而由于VC6把max()变成_cpp_max(),D无法~译. 

要在VC6用max(),只能退而求其次使用_cpp_max().或_MAX(). 
因ؓ在头文galgorithm包含的另一个头文gxutility里有一?  #define   _MAX   _cpp_max 

另外有一个相关的宏__max,   是定义在stdlib.h中的:#define   __max(a,b)   (((a)   >   (b))   ?   (a)   :   (b)),不过__max不是标准C++,是以前的C留下来的. 

引用自CSDN


Onway 2010-07-30 17:09 发表评论
]]>
ACM训练之道http://www.shnenglu.com/Onway/articles/101248.htmlOnwayOnwayTue, 17 Nov 2009 13:28:00 GMThttp://www.shnenglu.com/Onway/articles/101248.html摘自某位大牛的,于我Q\漫O?#8230;…




怿每一位玩ACME序设计竞赛的同学来_都有一个从入门到精通的q程Q而且分n他们l验的时候,见到最多的是一U合作和拼搏_Q乐在其中的那种Ȁ情?/span>

   Wilbert卛_毕业Q作Z个菜鸟的入门玩Ӟ一直很想知道如何能在程序设计竞赛中成ؓ一个高手。即无~类似竞赛的我,l于整理Z一些程序设计竞赛ACM训练之道Q愿与大家分享?

   首先是编E的能力Q一般要做到50行以内的E序不用调试?00行以内的二分钟内调试成功?

   训练qACM{程序设计竞赛的人在法上有较大的优势,q就说明当你~程能力提高之后Q主要时间是花在思考算法上Q不是花在写E序与debug上?

 我摘录了|上的一?训练计划 Q?

 W一阶段Q?l经典常用算法,下面的每个算法给我打上十C十遍Q同时自q代码Q因为太常用Q所以要l到写时不用惻I10-15分钟内打完?nbsp;  

1Q最短\QFloyd、Dijstra、BellmanFordQ;

2Q最生成树Q先写个primQkruscal要用q查集,不好写)Q?

3Q大敎ͼ高精度)加减乘除Q?/p>

4Q二分查找(代码可在五行以内Q;

5Q叉乘、判U段怺、然后写个凸包;

6QBFS、DFSQ同时熟lhash表(要熟Q要灉|,代码要简Q;

7Q数学上的有Q辗转相除(两行内)Q线D交炏V多角Ş面积公式Q?/p>

8Q调用系l的qsort, 技巧很多,慢慢掌握Q?/p>

9QQ意进刉的{?.....

 

W二阶段Q?l习复杂一点,但也较常用的法?如:   

1Q二分图匚wQ匈牙利Q,最\径覆盖;

2Q网l流Q最费用流Q?/p>

3Q线D|Q?/p>

4. q查集;   

5Q熟(zhn)动态规划的各个典型QLCS、最镉K增子串、三角剖分、记忆化dp    Q?/p>

6Q博弈类法。博弈树Q二q制法等Q?/p>

7Q最大团Q最大独立集Q?/p>

  8Q判断点在多边Ş内;

9Q差分约束系l;   

10Q双向广度搜索、A*法Q最耗散优先......

 法?有很多可以参考:

 1、Concrete Mathematics --- A Foundation For Computer Science

Ronald L. Graham Q?Donald E. Knuth Q?Oren Patashnik

q本书《具体数学》是Stanford计算机系的教材(1970 q开始给研究生授课)Q书的内Ҏ(gu)Knuth的巨著TAOCPW一章的扩展Q涉及了计算机科学领域内几乎所有可能遇到的数学知识。书中许多经兔R题的解答 比目前广泛流传的解法更易懂。对于提高大家的数学修养有很大帮助?

 

2、Introduction to Algorithms

Thomas H. Cormen QCharles E. Leiserson QRonald L. Rivest QClifford Stein

《算法导论》MIT计算机系的经典算法教材。作者Rivest获得qACM Turing AwardQ牛Q本书内容全面,语言通俗Q很适合大家入门?

 

3、实用算法的分析和程序设?/p>

吴文?王徏?/p>

大名鼎鼎?#8220;黑书”。内容包括了竞赛需要的各种法Q各U层ơ的读者都适合?

 

4、网l算法与复杂性理?/p>

谢政 李徏q?/p>

内容很丰富的图论教材

 

5、算?数据l构=E序

N.Wirth

Pascal语言的发明hWirth教授的名著,深入阐述了算法与数据l构的关p,Ҏ(gu)个算法都提供详细的Pascal源程序,适合各种水^的读者?

   最后,在学习算法提升战斗力的同Ӟ也要多做题目Q实战是很有必要的。其实ƈ不是所有的题目都是靠算法的Q有一些题目是有多U可以优化的手段Q也有一些工E性比较强的题目。上手做和把题做_还是有很大区别的(惭愧的说Q我是属于上手做,没有做精Q所?#8230;…Q?

   愿每一位程序设计竞赛爱好者挑战极限!



Onway 2009-11-17 21:28 发表评论
]]> þ޾Ʒ| þŷձƷ| 91þþƷֱ| þ99þ99Ʒӿ| þþþ޾Ʒһ| þ99Ʒһ| ƷһþþƷ| ˺ݺۺ88ۺϾþ| ƷۺϾþþþþ98| ŷþۺŷ| þþþþۺһĻ| 99þ99þþƷѿ| þ99Ʒ99þ6| þþƷAVӰԺ| ɫۺϾþҹɫƷ| ƷþþþӰԺɫ| þþþëƬ| þþƵ| ƷŮþþ| þþоƷĻ| þw5www| þþþþþۺ| þ߿ۿƷ㽶| þþƷƷ| þþƷav鶹С˵| þþƷ| 99þùۺϾƷԭ| 91þ㽶Ů߿| ŷþþþ9999| þþù| þƵ| þ޹˾Ʒɫ| ũ帾ŮëƬƷþ| 㽶þҹɫƷ| þ㽶97Ʒ| þ99Ʒ鶹ѿ| þþþþþ| þþžѸƵ| þۺϺݺۺϾþ| þþþþþùѿ| þ÷׾Ʒ|